पायथन कोड में PDB ब्रेकप्वाइंट लगाने का सरल तरीका?


105

बस एक सुविधा का सवाल है। मैं दृश्य स्टूडियो और XCode जैसे IDE में डिबगर्स के साथ थोड़ा खराब हो गया हूं। मुझे लगता है कि एक import pdb; pdb.set_trace()ब्रेकपॉइंट सेट करने के लिए टाइप करना थोड़ा अनाड़ी है (मैं फ़ाइल के शीर्ष पर pdb आयात नहीं करूंगा क्योंकि मैं भूल सकता हूं और इसे छोड़ दूं)।

क्या पायथन कोड में एक ब्रेकपॉइंट स्थापित करने का एक सरल तरीका है, जैसा कि आप एक आईडीई में देखते हैं जैसा कि सीधा और विनीत है?


PyCharm का उपयोग करें। पायथन आईडीई का उपयोग करने के अलावा, ब्रेकपॉइंट लाइन में प्रवेश करने की तुलना में यह कैसे सरल हो सकता है?
Ciro Santilli 郝海东 冠状 iro i 法轮功 '31

बस python -m pdb <your_script>.py फिर b <line_number>चुना लाइन नंबर (कोई फ़ंक्शन कोष्ठक) पर ब्रेकपॉइंट सेट करने के लिए उपयोग करें । cअपने ब्रेकपॉइंट को जारी रखने के लिए मारो । आप bआदेश द्वारा अपने सभी ब्रेकप्वाइंट का उपयोग करके देख सकते हैं । helpडीबगिंग के दौरान उपलब्ध अन्य pdb कमांड देखने के लिए टाइप करें।
आर्केल्डन

1
पायथन 3.7 के बाद से, अब आप बिल्टिन breakpoint()फ़ंक्शन का उपयोग कर सकते हैं । python.org/dev/peps/pep-0553
डैनियल

जवाबों:


117

आप अपने प्रोग्राम को pdbकमांड लाइन से चलाकर चला सकते हैं

python -m pdb your_script.py

यह 1 पंक्ति पर टूट जाएगा, फिर आप breakकमांड कोड का उपयोग करके अपने कोड में जहां भी चाहें, एक ब्रेकप्वाइंट जोड़ पाएंगे : इसका सिंटैक्स:

b (लीक) [[फ़ाइल नाम:] लिनीनो | समारोह [, हालत]]

यह आपको कहीं भी ब्रेकपॉइंट जोड़ने की क्षमता देने के लिए पर्याप्त लचीला है।


24
इस बिंदु को स्पष्ट करने के लिए, यदि मैं pdb.set_trace()और डिबगर में जाता हूं, तो lकमांड (सूची) का उपयोग करें और देखें कि मैं लाइन 27 पर एक ब्रेकपॉइंट सेट करना चाहता हूं, फिर मैं प्रवेश करूंगा: b 27और डीबगर लाइन 27 पर एक ब्रेकप्वाइंट सेट करेगा (मुझे मिला) प्रलेखन को समझने के लिए थोड़ा चुनौतीपूर्ण है, इसलिए स्पष्टीकरण के उस बिंदु को जोड़ना चाहते थे)।
बेंजामिनोग्रामस

9
इसके अलावा, यदि आपके पास कोई वस्तु है x, और आप रोकना चाहते हैं जब इसकी विधि fको बुलाया जाता है, तो आप कह सकते हैं break x.f, और फिर c(ontinue)। यह तब भी काम करता है जब ऑब्जेक्ट एक दुर्गम फ़ाइल में है या गतिशील रूप से बनाया गया था, जैसे कि अनप्लिकिंग द्वारा।
osa

2
स्टैकट्रेस के बाद डिबगिंग करते समय आप फुलपैथ को एक मॉड्यूल में कॉपी कर सकते हैं और लाइन नंबर को जोड़ सकते हैं जैसेb /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
वैध

58

आप उपयोग कर सकते हैं:

from pdb import set_trace as bp

code
code
bp()
code
code

यकीन नहीं हो रहा है कि क्यों अलफ़्लास अलियासिंग, लेकिन ;-)। किसी कारण से मेरी IDE / Editor (vscode) इस AM की घोड़ी बन रही थी और रेखांकित होती रहती है। आपकी टिप्पणी देखकर वास्तव में मुझे मदद मिली। आपका दिन अच्छा रहे!
MrMesees

आपको बहुत - बहुत धन्यवाद!
घोड़ी

मैं set_traceकेवल तभी आयात करने के लिए बाध्य कर सकता हूं जब मैं bp () का उपयोग करता हूं?
अल्पर

39

विम में, मेरे पास इसके लिए एक मैक्रो सेट है (मेरी .vimrc फ़ाइल में):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

इसलिए मैं सिर्फ \ b दबा सकता हूँ (जब इन्सर्ट मोड में नहीं) और यह करंट लाइन, या \ B (कैपिटल नोट करें) के बाद ब्रेकपॉइंट में जुड़ जाता है और यह करंट लाइन से पहले एक डालता है।

जो ठीक काम करने लगता है। अधिकांश अन्य 'सरल' प्रोग्रामर संपादकों (emacs, sublimetext, आदि) के पास ऐसा करने के आसान तरीके होने चाहिए।

संपादित करें: मेरे पास वास्तव में है:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

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

2019 अपडेट (पायथन 3.7+)

पायथन 3.7+ में अब बिलिन है breakpoint()जो पिछले import pdb; pdb.set_trace()को विम में बदल सकता है । यह अभी भी वही काम करता है।


2
अच्छा समाधान, और गयी लाइन में सही इंडेंटेशन होगा यदि आपके पास set autoindentआपकी .vimrc फ़ाइल है।
जेली

हां, मैं समझ नहीं पा रहा हूं कि अधिकांश डिस्ट्रोस set autoindentमानक के रूप में (और अन्य विकल्पों का एक गुच्छा) जहाज क्यों नहीं करते हैं । पहली चीज़ जो मैं एक नई प्रणाली के साथ करता हूं, वह बेहतर vimrc में है ...
डैनियल

1
बस एक विम नाम रजिस्टर का उपयोग करें! उस लाइन को सहेजें जिसे आप दबाकर 'd' (जैसा कि d eug में) बफर करना चाहते हैं "dyyऔर जब भी जरूरत हो बस करें "dpया "dPविम रजिस्टर जानें ! वे बहुत उपयोगी हैं और हमेशा समर्थित हैं!
पोलोवेज़ुल

कैसे जोड़ें: उसके बाद डब्ल्यू?
ji-ruh

नामित रजिस्टर अवधारणा को थोड़ा आगे बढ़ाते हुए, आप एक मैक्रो रिकॉर्ड कर सकते हैं, आवश्यक संचालन कर सकते हैं और फिर मैक्रो को रोक सकते हैं। फिर अपने vimrc फ़ाइल में मैक्रो सामग्री पेस्ट करें। उदाहरण के लिए, मैक्रो के साथ शुरू करें qd, फिर बाद "dpमें चिपकाने के लिए। अंत में अपने निर्देशों को एक रजिस्टर में असाइन करें ताकि हमेशा विम लोडअप पर आबाद रहे। उदाहरण: let @d = 'oimport pdb; pdb.set_trace()k0:w' अब, @dजब भी आप लाइन को फाइल में पेस्ट करना चाहते हैं, तब उपयोग करें । ऊपर भी फ़ाइल सहेजता है। लेकिन आपको अपना रिकॉर्ड (कॉपी / पेस्ट के बजाय ऊपर) दर्ज करना होगा, क्योंकि विशेष आकर्षण इसमें शामिल हैं (भागने आदि के लिए)।
आर्केल्डन

27

यदि आप प्रोग्राम (पायथन 3.2+ में) को चलाने के लिए हर बार ब्रेकपॉइंट मैन्युअल रूप से सेट नहीं करना चाहते हैं, उदाहरण के लिए, आप सीधे लाइन 3 पर एक ब्रेकपॉइंट बनाना चाहते हैं और वहां निष्पादन को रोकें:

python -m pdb -c "b 3" -c c your_script.py

निम्नलिखित जानकारी मदद कर सकती है:

यदि कोई फ़ाइल .pdbrc उपयोगकर्ता के होम डायरेक्टरी या करंट डाइरेक्टरी में मौजूद है, तो उसे डीबगर प्रॉम्प्ट पर टाइप किया गया है, जैसे कि उसमें पढ़ा और निष्पादित किया जाता है। यह विशेष रूप से उपनामों के लिए उपयोगी है। यदि दोनों फाइलें मौजूद हैं, तो होम डायरेक्टरी में से एक को पहले पढ़ा जाता है और वहां परिभाषित उपनामों को स्थानीय फाइल द्वारा ओवरराइड किया जा सकता है।

संस्करण 3.2 में परिवर्तित: .pdbrc में अब डीबग करना जारी रखने वाले कमांड हो सकते हैं, जैसे कि जारी या अगला। पहले, इन आदेशों का कोई प्रभाव नहीं था।

संस्करण 3.2 में नया: pdb.py अब एक -c विकल्प को स्वीकार करता है जो कमांड निष्पादित करता है जैसे कि .pdbrc फ़ाइल में दिया गया है, डीबगर कमांड देखें।


23

मैंने अभी तक इसकी कोशिश नहीं की है, लेकिन उन्होंने पायथन 3.7 में एक नया बिल्ट-इन ब्रेकपॉइंट () लागू किया है, जिसका अर्थ है कि आप अब एक स्टेटमेंट के साथ एक ब्रेकपॉइंट डाल सकते हैं:

breakpoint()

1
पायथन 3.7 के रूप में, यह उत्तर है।
एरिक

10

यह है कि आप अपने स्रोत कोड में कुछ भी लागू किए बिना कमांड लाइन में pdb का उपयोग कैसे करेंगे (प्रलेखन और अन्य ऑनलाइन संसाधन एक प्रोग्रामर को यह समझाते हुए एक अच्छा काम नहीं करते हैं जिसने अतीत में केवल दृश्य डीबगर्स का उपयोग किया है):

शेल प्रॉम्प्ट में निम्न लिखकर pdb प्रारंभ करें:

python -m pdb 'python_script'

यह कमांड pdb को इनिशियलाइज़ करता है और pdb डीबगर आपके python_script की पहली पंक्ति में टूट जाएगा और आपसे इनपुट की प्रतीक्षा करेगा:

(Pdb)

यह डीबगर के साथ संचार करने के लिए इंटरफ़ेस है। अब, आप अपने आदेश यहाँ निर्दिष्ट कर सकते हैं। दृश्य डीबगर्स में बटन या कीबोर्ड शॉर्टकट का उपयोग करने का विरोध किया गया है, यहां आप समान परिणाम प्राप्त करने के लिए कमांड का उपयोग करेंगे।

आप अपने कोड में कमांड "n" (अगली) पर जा सकते हैं:

(Pdb) n

अगला प्रदर्शन लाइन नंबर और स्रोत में विशिष्ट कोड प्रदर्शित करेगा:

> python_script(line number)method name
-> current line in the source code

आप अपने स्रोत कोड में एक लाइन नंबर निर्दिष्ट करके एक ब्रेकपॉइंट सेट कर सकते हैं।

(Pdb) b 50

यहाँ, डिबगर को 50 पर तोड़ने के लिए सेट किया गया है। यदि कोई अन्य ब्रेकप्वाइंट नहीं हैं, तो लाइन 50 पर ब्रेकपॉइंट पहले होगा और इसे ब्रेकपॉइंट आईडी द्वारा संदर्भित किया जा सकता है जो इस मामले में 1 है। यदि आप अधिक विराम बिंदु जोड़ते हैं तो उन्हें क्रमिक रूप से पहचानकर्ता मिलेंगे (अर्थात, 2, 3 आदि)

एक बार एक ब्रेकपॉइंट सेट होने के बाद, आप अपने प्रोग्राम को तब तक जारी रखेंगे जब तक pdb ब्रेकपॉइंट पर निम्नानुसार नहीं हो जाता:

(Pdb) c

एक बार जब आप ब्रेकपॉइंट पर पहुंच जाते हैं, तो आप अगली पंक्ति में जा सकते हैं, एन कमांड के साथ जैसा कि पहले बताया गया है। यदि आप चर के मूल्यों की जांच करना चाहते हैं, तो आप निम्नानुसार पैरामीटर कमांड निष्पादित करेंगे:

(Pdb) p variable_name

यदि आपको अब ब्रेकपॉइंट की आवश्यकता नहीं है, तो आप ब्रेकपॉइंट की आईडी में स्पष्ट कमांड के साथ पास करके इसे साफ़ कर सकते हैं:

(Pdb) clear 1

अंत में, जब आप डीबगर के साथ किया जाता है तो आप निष्पादन से बाहर निकल सकते हैं क्योंकि आप अजगर कमांड लाइन दुभाषिया से बाहर निकलेंगे।

(Pdb) exit()

मुझे उम्मीद है कि इससे किसी को भी पीडीबी शुरू करने में मदद मिलेगी। यहां उन आदेशों की एक सूची दी गई है जिनका उपयोग आप डिबगर के साथ कर सकते हैं: पीडीबी तो सवाल और जवाब



4

आप एक IDE का उपयोग कर सकते हैं जो अजगर डिबगिंग का समर्थन करता है, या आप उत्कृष्ट Winpdb टूल की जांच कर सकते हैं। जो किसी भी प्लेटफ़ॉर्म पर काम करता है और आपकी पाइथन स्क्रिप्ट को ग्राफिकल डीबगिंग की सुविधा प्रदान करता है।

http://winpdb.org/


2

आप उपयोग कर सकते हैं:

  • विंग ide
  • pydev plugin से ग्रहण करें
  • pycharms

उपरोक्त सभी एक आईडीई के अंदर से पायथन डिबगिंग का समर्थन करते हैं।


0

एटम में यदि पायथन प्लगइन्स इंस्टॉल हो गए हैं, तो आप बस ' pdb' और हिट एंटर टाइप कर सकते हैं और स्निपेट आयात और ट्रेस आपके लिए वापस टाइप करेंगे।

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


0

एक रेखांकित विधि सीधे pdb में ब्रेकपॉइंट सेट करने के लिए है:

pdb> b torch/__init__:10

पर एक विराम बिंदु निर्धारित करेगा site-packages\torch\__init__.py:10

फिर pdb> cइस ब्रेकपॉइंट पर रुक जाएगा।

निम्नलिखित भी मान्य हैं:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

विस्तार के लिए डॉक्टर देखें


0

आप एली प्लगइन के साथ पायथन-मोड प्लगइन या एमएसीएस के साथ विम का उपयोग कर सकते हैं ।

ये प्लगइन्स आपको आसान कीस्ट्रोक्स ( \ bविम में और C-c C-u bEmacs में) के साथ-साथ हैवी-वेट आईडीई (कोड फोल्डिंग, रीफैक्टरिंग, लाइनिंग, आदि) से कई अन्य सुविधाएँ देते हैं - ये सभी एक लाइट-वेट टर्मिनल-आधारित एडिटर के भीतर हैं।


-1

आपकी स्क्रिप्ट पर डीबगर को चलाने का सबसे सरल तरीका है

pdb your_script.py

लिनक्स कमांड लाइन पर pdb चलाना देता है

usage: pdb.py scriptfile [arg] ...

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