पायथन के अपने डिबगर (पीडीबी) के भीतर बहु-लाइन कथनों को कैसे निष्पादित करें


157

इसलिए मैं एक पायथन स्क्रिप्ट चला रहा हूं जिसके भीतर मैं पायथन के डिबगर, पीडीबी लिखकर बुला रहा हूं:

import ipdb; ipdb.set_trace()

(पीडीबी के iPython के संस्करण, हालांकि इस मामले के लिए मुझे नहीं लगता कि इससे कोई फर्क पड़ता है; मैं इसे केवल रंगीन आउटपुट के लिए उपयोग करता हूं)।

अब, जब मुझे डीबगर के लिए मिलता है, तो मैं एक बहु-पंक्ति विवरण निष्पादित करना चाहता हूं जैसे कि एक खंड या एक लूप के लिए, लेकिन जैसे ही मैं टाइप करता हूं

if condition:

और वापसी कुंजी मारा, मुझे त्रुटि संदेश मिलता है *** SyntaxError: invalid syntax (<stdin>, line 1)

पीडीबी के भीतर कोई बहु-लाइन स्टेटमेंट कैसे निष्पादित कर सकता है? यदि संभव नहीं है, तो इसके चारों ओर एक रास्ता है अगर अभी भी एक क्लॉज या लूप के लिए निष्पादित हो रहा है?

जवाबों:


265

आप ऐसा कर सकते हैं, जबकि पीडीबी में सभी उपलब्ध स्थानीय चर के साथ एक अस्थायी इंटरैक्टिव पायथन सत्र शुरू करने के लिए:

(pdb) !import code; code.interact(local=vars())
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

जब आप पूरा कर लें, तो नियमित pdb प्रॉम्प्ट पर लौटने के लिए Ctrl-D का उपयोग करें।

बस Ctrl-C को मत मारो, जो पूरे पीडीबी सत्र को समाप्त कर देगा।


46
ऐसा लगता है कि pdb interactकमांड का उपयोग करके इसे प्राप्त किया जा सकता है ( जैसा कि मैंने इस बग ट्रैकर संदेश से सीखा है )।
गेरिट

3
बयान !में क्यों आवश्यक है import?
इन्द्रधनुष गुप्ता

19
शायद इसकी जरूरत नहीं है, लेकिन मुझे !दुर्घटनाओं से बचने के लिए, pdb में सभी पायथन बयानों को उपसर्ग करने की आदत है । जैसे c = 42pdb में वेरिएबल को असाइन करने के बजाय निष्पादन जारी रहेगाc
मारियस गेदमिनस

8
PDM के साथ सबसे निराशाजनक बात @MariusGedminas! अच्छा होगा यदि उनकी आज्ञाओं को पूर्वसर्ग किया जाए ...
इयान क्लार्क

नोट: Ctrl-D interactभी बाहर निकलने का सही तरीका लगता है, लेकिन यह मेरे लिए स्पाइडर के साथ अच्छा नहीं खेलता है।
जोशिया योदर

69

Python3 में ipdb(और pdb) के पास इंटरेक्शन नामक एक कमांड है । यह करने के लिए इस्तेमाल किया जा सकता है:

एक इंटरएक्टिव इंटरप्रेटर ( कोड मॉड्यूल का उपयोग करके ) शुरू करें, जिसके वैश्विक नामस्थान में वर्तमान दायरे में पाए गए सभी (वैश्विक और स्थानीय) नाम हैं।

इसका उपयोग करने के लिए, बस interactपीडीबी प्रॉम्प्ट पर दर्ज करें । अन्य बातों के अलावा, यह कई पंक्तियों में फैले कोड को लागू करने के लिए उपयोगी है, और अन्य पीडीबी कमांडों के आकस्मिक ट्रिगर से बचने के लिए भी।


2
ऐसा करने पर मुझे "NameError: नाम 'इंटरैक्शन' परिभाषित नहीं है"।
जेसन

1
@ हसन संस्करण 3.2 या उच्चतर
vaer-k

2
वह समझाता है। मैं 2.7 पायथन में था।
जेसन

सावधानी से यह वास्तव में एक त्रुटि है कि बातचीत को परिभाषित नहीं किया जा सकता है और इस प्रक्रिया से बाहर निकल गया है
Camron_Godbout

1
मुझे लगता है कि बचने interactका सुझाव देना भी एक सुझाव है। 90% यह सब मैंने कभी जरूरत है, और यह की तुलना में टाइप करने के लिए एक बहुत आसान हैfrom IPython import embed; embed()
vaer-कश्मीर

43

मेरी सिफारिश IPython एम्बेडिंग का उपयोग करने के लिए है।

ipdb> from IPython import embed; embed()

2
यदि आप मूल्य समझ रहे हैं तो सूची में त्रुटि को परिभाषित नहीं किया गया है, IPython से उपयोग करने का प्रयास करें import embed; embed(user_ns=locals())
fx-kirin

1
यह मेरे लिए स्वीकृत उत्तर की तुलना में कहीं बेहतर काम करता है। उदाहरण के लिए - यह मल्टीलाइन के समुचित संपादन की अनुमति देता है - जैसे कुछ पंक्तियों का वापस जाना और कुछ को ठीक करना, इसलिए आपको अपनी संपूर्ण बहु-पंक्ति अभिव्यक्ति को फिर से लिखना नहीं पड़ता है ... मैं स्थानीय लोगों को @ fx-kirin के रूप में पारित कर रहा हूं। सुझाव दिया।
ZeDuS

33

पायथन (2.7.1) दुभाषिया या डिबगर (आयात पीडीबी) के अंदर, आप निम्नलिखित वाक्यविन्यास के साथ एक बहु-पंक्ति विवरण निष्पादित कर सकते हैं।

for i in range(5): print("Hello"); print("World"); print(i)

नोट: जब मैं दुभाषिया के अंदर हूं, तो कोड निष्पादित होने से पहले मुझे दो बार रिटर्न मारना होगा। डिबगर के अंदर, हालांकि, मुझे केवल एक बार रिटर्न मारना है।


5
यह एक स्तर से अधिक कुछ भी चलाने की अनुमति नहीं देता है।
एंटनी हैचिन्स

7

एक विशेष बात यह है कि यदि आप चाहते हैं कि ब्रेक प्वाइंट मारते समय एक-दो कमांड निष्पादित किए जाएं। फिर डिबगर कमांड है commands। यह आपको कमांड की कई लाइनों में प्रवेश करने की अनुमति देता है और फिर endकुंजी शब्द के साथ पूरे अनुक्रम को समाप्त करता है । अधिक के साथ (pdb) help commands


2

मुझे नहीं पता कि अगर आप ऐसा कर सकते हैं, तो यह ipdb के लिए एक बड़ी सुविधा होगी। आप पाठ्यक्रम की सूची समझ का उपयोग कर सकते हैं, और सरल बहु-पंक्ति अभिव्यक्तियों को निष्पादित कर सकते हैं जैसे:

if y == 3: print y; print y; print y;

आप पहले से ही कुछ कार्य लिख सकते हैं जो भी करने की आवश्यकता है वह करें जो कि सामान्य रूप से कई लाइनें लेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.