कार्य निष्पादित करते समय अजगर इंटरप्रेटर में गिरना


90

मैं एक समारोह के साथ एक अजगर मॉड्यूल है:

def do_stuff(param1 = 'a'):
    if type(param1) == int:
        # enter python interpreter here
        do_something()
    else:
        do_something_else()

वहाँ कमांड लाइन दुभाषिया में ड्रॉप करने के लिए एक रास्ता है जहाँ मैं टिप्पणी है? ताकि अगर मैं अजगर में निम्नलिखित चलाऊं:

>>> import my_module
>>> do_stuff(1)

मुझे अपना अगला संकेत कहां है और मुझे इस बारे में टिप्पणी करने की गुंजाइश है do_stuff()?


जवाबों:


61

डालने

import pdb; pdb.set_trace()

उस बिंदु पर अजगर डिबगर में प्रवेश करेगा

यहां देखें: http://docs.python.org/library/pdb.html


pdbमहान वैनिला पायथन है; यदि आपके पास एक बाहरी पैकेज में लाने के लिए जगह है, ipdbतो डिबगर के रूप में बहुत ही कार्यक्षमता है, लेकिन सिंटैक्स हाइलाइटिंग, टैब पूरा होने, आदि के साथ ipython के
— khstacking

अद्यतन - ipdbआजकल हटा दिया गया था , जिसका मैं उपयोग करता हूं pdbpp( pdb++) , जिसमें समान विशेषताएं हैं, और इसके साथ काम करता है import pdb; pdb.set_trace()(यानी यह आयात करता है, इसलिए यह ड्रॉप-इन प्रतिस्थापन है)
— driftcatcher

@hangtwenty: आप क्यों कहते हैं कि ipdbपदावनत किया गया था? मुझे उसकी कोई खबर नहीं मिल रही है।
— निक मैटेओ

@ कुंदर हुह, आप सही कह रहे हैं। मुझे कहीं न कहीं यह पढ़कर याद है कि लेखकों ने परियोजना को बनाए रखने से रोकने का फैसला किया था और इसके बजाय किसी अन्य परियोजना की ओर इशारा किया था। हो सकता है कि थोड़ा सा हुआ और फिर इसे पुनर्जीवित किया गया? मै गलत हो सकता हूँ! किसी भी मामले में, मैंने ipdbपहले भी आनंद लिया था, लेकिन pdbppबाद में आनंद लिया है
— बहाव

142

यदि आप मानक इंटरएक्टिव प्रॉम्प्ट चाहते हैं (डिबगर के बजाय, जैसा कि प्रीस्टोमेशन द्वारा दिखाया गया है), आप यह कर सकते हैं:

import code
code.interact(local=locals())

देखें: कोड मॉड्यूल ।

यदि आपके पास IPython स्थापित है, और इसके बजाय एक IPython शेल चाहते हैं, तो आप IPython> 0.11 के लिए यह कर सकते हैं:

import IPython; IPython.embed()

या पुराने संस्करणों के लिए:

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell(local_ns=locals())

27
IPython के लिए = = 0.11, IPython में कोई अधिक मॉड्यूल शेल नहीं है ... इसलिए इसके बजाय "आयातyython; IPython.embed ()" का उपयोग करके इसे प्रारंभ करें।
— 10

क्या प्रवेश के बाद जारी रखना संभव है code.interact(), एक ला पीडीबी c(ontinue)?
— निक टी

4
code.interact()एक अवरुद्ध कॉल है। आपका कार्यक्रम बंद हो जाएगा और इसके खत्म होने का इंतजार करेंगे। यदि आप इंटरएक्टिव इंटरप्रेटर से बाहर निकलते हैं, तो आपके कार्यक्रम को तुरंत निम्नलिखित कथन के साथ फिर से शुरू करना चाहिए।
— मैट एंडरसन

1
इंटरएक्टिव प्रॉम्प्ट और डिबगर के बीच क्या अंतर है?
— स्टॉकब

1
@StockB यह मानक इंटरैक्टिव प्रॉम्प्ट है जो इसे महत्वपूर्ण बनाता है। डीबगर एक संवादात्मक संकेत है, लेकिन यह समान नहीं है। PDB में, आप मल्टी-लाइन स्टेटमेंट नहीं कर सकते हैं, बिल्ट-इन helpफ़ंक्शन ओवरराइड है, आदि
— 21

28

यदि आप एक डिफ़ॉल्ट पायथन दुभाषिया चाहते हैं, तो आप कर सकते हैं

import code
code.interact(local=dict(globals(), **locals()))

यह स्थानीय और ग्लोबल दोनों तक पहुंच की अनुमति देगा।

यदि आप एक IPython दुभाषिया में छोड़ना चाहते हैं, तो IPShellEmbedसमाधान पुराना है । वर्तमान में क्या काम करता है:

from IPython import embed
embed()

8
धन्यवाद, code.interact(local=dict(globals(), **locals()))यह बहुत बेहतर है code.interact(local=locals())क्योंकि उत्तरार्द्ध आपको पुन: आयात पैकेज बनाता है
— s2t2

इस जवाब ने मेरे लिए बेहतर काम किया क्योंकि मैं अपने पायथन कोड को कॉल करने के लिए एक बैश स्क्रिप्ट का उपयोग कर रहा था। मैं स्वीकृत उत्तर का उपयोग करते हुए अपने अजगर कोड के साथ बातचीत नहीं कर सका। धन्यवाद!
— jonathanking
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.