IPython के साथ कदम दर कदम डिबगिंग


170

मैंने जो पढ़ा है, उसमें पायथन में कोड को डिबग करने के दो तरीके हैं:

  • पारंपरिक डिबगर जैसे pdbया के साथ ipdb। जैसे यह समर्थन करता है आदेशों cके लिए continue, nके लिए step-over, sके लिए step-intoआदि), लेकिन आप जो वस्तु निरीक्षण के लिए अत्यंत उपयोगी हो सकता है एक IPython खोल के लिए सीधी पहुँच नहीं है।

  • का उपयोग करते हुए IPython द्वारा embedding अपने कोड में किसी IPython खोल। आप कर सकते हैं from ipython import embed, और फिर embed()अपने कोड में उपयोग कर सकते हैं । जब आपका प्रोग्राम / स्क्रिप्ट एक embed()स्टेटमेंट को हिट करता है, तो आपको एक IPython शेल में छोड़ दिया जाता है। यह सभी IPython उपहारों का उपयोग करके ऑब्जेक्ट्स के पूर्ण निरीक्षण और पायथन कोड के परीक्षण की अनुमति देता है। हालाँकि, जब embed()आप उपयोग करते हैं तो कोड के माध्यम से कदम नहीं रख सकते हैं और अब आसान कीबोर्ड शॉर्टकट के साथ।

क्या दोनों दुनिया के सर्वश्रेष्ठ को मिलाने का कोई तरीका है? अर्थात

  1. आसान pdb / ipdb कीबोर्ड शॉर्टकट के साथ अपने कोड के माध्यम से चरण-दर-चरण सक्षम रहें ।
  2. ऐसे किसी भी कदम पर (जैसे दिए गए कथन पर), एक पूर्ण IPython शेल तक पहुँच है ।

MATLAB में IPython डिबगिंग :

इस प्रकार के "एन्हांस्ड डिबगिंग" का एक उदाहरण MATLAB में पाया जा सकता है, जहां उपयोगकर्ता को हमेशा MATLAB इंजन / शेल तक पूर्ण पहुंच होती है, और वह अभी भी अपने कोड के माध्यम से चरण-दर-चरण , सशर्त ब्रेकप्वाइंट को परिभाषित कर सकती है, आदि। मैंने अन्य उपयोगकर्ताओं के साथ जो चर्चा की है, यह डीबगिंग विशेषता है जो लोग MATLAB से IPython में जाने पर सबसे ज्यादा याद करते हैं।

Emacs और अन्य संपादकों में IPython डिबगिंग:

मैं इस प्रश्न को भी विशिष्ट नहीं बनाना चाहता, लेकिन मैं ज्यादातर Emacs में काम करता हूं, इसलिए मुझे आश्चर्य होता है कि क्या इस कार्यक्षमता को लाने का कोई तरीका है। आदर्श रूप से , Emacs (या संपादक) प्रोग्रामर को कोड पर कहीं भी ब्रेकप्वाइंट सेट करने और दुभाषिया या डिबगर के साथ संवाद करने की अनुमति देगा ताकि आपकी पसंद के स्थान पर रुक जाए, और उस स्थान पर एक पूर्ण IPython इंटरचेटर ला सके।


pdb के पास !कमांड है जो ब्रेकपॉइंट पर किसी भी अजगर कमांड को निष्पादित करता है
दिमित्री गैल्किंस्की

5
मैं भी मतलूब की तरह एक अजगर डीबगर की मांग कर रहा हूँ! उदाहरण के लिए, मैं अजगर खोल में बहुत सारे प्रोटोटाइप करता हूं। सभी चर खोल के साथ सहेजे जाते हैं। अब मैं एक समस्या से मिलता हूं। मुझे लगता है कि शेल के साथ गणना किए गए चर के साथ, कोड के एक छोटे टुकड़े को डीबग करना होगा। हालाँकि, एक नया डीबगर पुराने चर को एक्सेस नहीं कर सकता है। यह प्रोटोटाइप के लिए सुविधाजनक नहीं है।
user1914692

1
Emacs उपयोगकर्ताओं के लिए, RealGUD में एक अविश्वसनीय रूप से अच्छा इंटरफ़ेस है।
मेहरबान

1
धन्यवाद @ क्लेमेंट मैं पिछले महीने में रेपो का अनुसरण कर रहा हूं और मैं इस परियोजना के बारे में बहुत उत्साहित हूं :) मैंने अभी तक इसकी कोशिश नहीं की है, लेकिन एक बार मैं (या यदि आप करते हैं) तो यहां एक उत्तर लिखने के लिए स्वतंत्र महसूस करते हैं कि शायद दिखाता है कि कैसे अनुरोध किया जाता है। संदर्भ के लिए दूसरों के लिए, URL github.com/rocky/emacs-dbgr
एमेलियो वाज़क्वेज़-रीना

@ क्लेमेंट इसके अलावा, यदि आपके पास RealGUD और ipdb के साथ कोई अनुभव है, तो मैंने इसका उपयोग करने की कोशिश की जैसा कि यहां बताया गया है github.com/rocky/emacs-dbgr/issues/96 बिना भाग्य।
एमेलियो वाज़केज़-रीना

जवाबों:


61

आप आईपीथॉन के %pdbजादू का उपयोग कर सकते हैं । बस %pdbIPython में कॉल करें और जब कोई त्रुटि होती है, तो आप स्वचालित रूप से हटा दिए जाते हैं ipdb। जब आपके पास तुरंत कदम नहीं है, तो आप ipdbबाद में हैं।

यह व्यक्तिगत कार्यों को डीबग करना आसान बनाता है, क्योंकि आप केवल एक फ़ाइल को लोड कर सकते हैं %loadऔर फिर एक फ़ंक्शन चला सकते हैं। आप एक assertसही स्थिति में एक त्रुटि के साथ मजबूर कर सकते हैं ।

%pdbएक लाइन जादू है। के रूप में यह कॉल %pdb on, %pdb 1, %pdb offया %pdb 0। यदि तर्क के बिना कहा जाता है तो यह टॉगल के रूप में काम करता है।


6
^ यह असली जवाब है
सीजर

क्या ऐसा ही कुछ है जहां पीडीबी में आईपीथॉन की तरह आईपीथॉन है, जो शुरू में आइपीथॉन में नहीं था।
लुकास

4
तुम भी कार्यक्रम शुरू कर सकते हैं ipython --pdb file.py -- argsऔर एक अपवाद पर ipdb पर गिराए जाते हैं। उत्तर में जोड़ने लायक हो सकता है।
सेबस्टियन

110

Ipdb.set_trace () के बारे में क्या? आपके कोड में:

import ipdb; ipdb.set_trace()

अद्यतन : अब पायथन 3.7 में, हम लिख सकते हैं breakpoint()। यह समान काम करता है, लेकिन यह PYTHONBREAKPOINTपर्यावरण चर का भी पालन करता है । यह सुविधा इस पीईपी से आती है ।

यह आपके कोड का पूर्ण निरीक्षण करने की अनुमति देता है, और आपके पास कमांड c( जैसे ) जारी है, n(अगली पंक्ति निष्पादित करें), s(बिंदु पर विधि में कदम) और इसी तरह तक पहुंच है ।

Ipdb रेपो और कमांड्स की सूची देखें । IPython अब कहा जाता है (संपादित करें: हिस्सा) Jupyter


पीएस: ध्यान दें कि एक ipdb कमांड अजगर कोड पर पूर्वता लेता है। तो लिखने के लिए list(foo)आपको आवश्यकता होगी print list(foo)

इसके अलावा, यदि आप ipython प्रॉम्प्ट (इसके emacs और vim मोड, इतिहास, पूर्णताएं, ...) को पसंद करते हैं, तो यह आपके प्रोजेक्ट के लिए समान होना आसान है क्योंकि यह अजगर प्रॉम्प्ट टूलकिट पर आधारित है ।


10
इसे करने का यही तरीका है।
१२:०५ बजे जे ०१० यूयू

मेरे जवाब में अब शामिल है कि ipdbEmacs का उपयोग कैसे किया जाए RealGUDऔर isend-modeओपी क्या पूछता है।
एमेलियो वाज़केज़-रीना

1
जुपिटर IPython के लिए नहीं, बल्कि IPython नोटबुक के लिए एक प्रतिस्थापन है। बृहस्पति नोटबुक पृष्ठभूमि में गिरी का उपयोग करता है। पायथन नोटबुक के लिए, कर्नेल आमतौर पर एक आईपाइथन कर्नेल होता है। IPython परियोजना आगे जारी है।
FA

1
breakpoint()अद्भुत है। PyCharm में यह आपको PyCharm डिबगर में भी ड्राप करता है। यह कंसोल में चिपकाए गए फ़ंक्शंस में से PyCharm डिबगर में प्रवेश करने का एक त्वरित तरीका है।
रिचर्ड मोहन

40

(28 मई, 2016 को अद्यतन) Emacs में RealGUD का उपयोग करना

Emacs में किसी के लिए, यह थ्रेड दिखाता है कि ओपी (और अधिक) में वर्णित सभी चीजों का उपयोग कैसे किया जाए

  1. RealGUD नामक Emacs में एक नया महत्वपूर्ण डिबगर जो किसी भी डीबगर (सहित ipdb) के साथ काम कर सकता है ।
  2. Emacs पैकेज isend-mode

इन दोनों पैकेजों का संयोजन बेहद शक्तिशाली है और यह व्यक्ति को ओपी में वर्णित व्यवहार को फिर से बनाने और और भी अधिक करने की अनुमति देता है।

RealGUD के विकी लेख पर अधिक जानकारी के लिए ipdb।


मूल उत्तर:

पायथन को डिबग करने के लिए कई अलग-अलग तरीकों की कोशिश करने के बाद, इस धागे में उल्लिखित सब कुछ सहित, आइपीथॉन के साथ पायथन को डिबग करने के मेरे पसंदीदा तरीकों में से एक एम्बेडेड गोले के साथ है।

एक कस्टम एम्बेडेड IPython शेल को परिभाषित करना:

निम्नलिखित को अपनी स्क्रिप्ट पर जोड़ें PYTHONPATH, ताकि विधि ipsh()उपलब्ध हो जाए।

import inspect

# First import the embed function
from IPython.terminal.embed import InteractiveShellEmbed
from IPython.config.loader import Config

# Configure the prompt so that I know I am in a nested (embedded) shell
cfg = Config()
prompt_config = cfg.PromptManager
prompt_config.in_template = 'N.In <\\#>: '
prompt_config.in2_template = '   .\\D.: '
prompt_config.out_template = 'N.Out<\\#>: '

# Messages displayed when I drop into and exit the shell.
banner_msg = ("\n**Nested Interpreter:\n"
"Hit Ctrl-D to exit interpreter and continue program.\n"
"Note that if you use %kill_embedded, you can fully deactivate\n"
"This embedded instance so it will never turn on again")   
exit_msg = '**Leaving Nested interpreter'

# Wrap it in a function that gives me more context:
def ipsh():
    ipshell = InteractiveShellEmbed(config=cfg, banner1=banner_msg, exit_msg=exit_msg)

    frame = inspect.currentframe().f_back
    msg   = 'Stopped at {0.f_code.co_filename} at line {0.f_lineno}'.format(frame)

    # Go back one level! 
    # This is needed because the call to ipshell is inside the function ipsh()
    ipshell(msg,stack_depth=2)

फिर, जब भी मैं अपने कोड में कुछ डिबग करना चाहता हूं, मैं ipsh()उस स्थान पर सही जगह रखता हूं जहां मुझे ऑब्जेक्ट निरीक्षण आदि करने की आवश्यकता होती है, उदाहरण के लिए, मैं my_functionनीचे डिबग करना चाहता हूं

उसका इस्तेमाल कर रहे हैं:

def my_function(b):
  a = b
  ipsh() # <- This will embed a full-fledged IPython interpreter
  a = 4

और फिर मैं my_function(2)निम्नलिखित तरीकों में से एक में आह्वान करता हूं :

  1. या तो एक पायथन प्रोग्राम चलाकर जो इस फ़ंक्शन को यूनिक्स शेल से आमंत्रित करता है
  2. या इसे सीधे IPython से मंगवाकर

इसके बावजूद कि मैं इसे कैसे लागू करता हूं, दुभाषिया उस रेखा पर रुक जाता है जो कहती है ipsh()। एक बार जब आप कर रहे हैं, आप कर सकते हैं Ctrl-Dऔर पायथन निष्पादन को फिर से शुरू करेगा (आपके द्वारा किए गए किसी भी चर अपडेट के साथ)। ध्यान दें, यदि आप एक नियमित IPython IPython शेल (ऊपर केस 2) से कोड चलाते हैं, तो नए IPython शेल को उसी के अंदर नेस्टेड किया जाएगा, जिससे आपने इसे इनवाइट किया था, जो पूरी तरह से ठीक है, लेकिन इसके बारे में पता होना अच्छा है। किसी भी तरह, एक बार दुभाषिया के स्थान पर रुकने के बाद ipsh, मैं a(जो हो सकता है 2) के मूल्य का निरीक्षण कर सकता हूं , देखें कि क्या फ़ंक्शन और ऑब्जेक्ट परिभाषित हैं, आदि।

समस्या:

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

आप अभी के लिए सबसे अच्छा कर सकते हैं:

वर्कअराउंड को ipsh()विभिन्न स्थानों पर एक प्राथमिकता देना है, जहां आप पाइथन इंटरप्रेटर को एक आईपीथॉन शेल (यानी ए breakpoint) लॉन्च करना चाहते हैं । तब आप अलग-अलग पूर्व-परिभाषित, हार्ड-कोडेड "ब्रेकप्वाइंट" के बीच "कूद" सकते हैं Ctrl-D, जो मौजूदा एम्बेडेड IPython शेल से बाहर निकल जाएगा और जब भी दुभाषिया अगली कॉल को हिट करेगा, तब बंद हो जाएगा ipsh()

यदि आप इस मार्ग पर जाते हैं, तो "डिबगिंग मोड" से बाहर निकलने और बाद के सभी ब्रेकपॉइंट्स को अनदेखा करने का एक तरीका है, इसका उपयोग करना है ipshell.dummy_mode = Trueजो पायथन को उस ipshellवस्तु के किसी भी बाद के तात्कालिकता को अनदेखा करेगा जो हमने ऊपर बनाया था।


2
जब भी आपको कोई बेहतर समाधान मिले तो कृपया इसे अपडेट करें। लेकिन यह बहुत अच्छा लग रहा है। मैं इसका उपयोग करूंगा।
फणी

1
आप / cfg, banner_msg, exit_msg और निरीक्षण को कैसे परिभाषित / आयात करते हैं?
गॉर्डन बीन

1
यह मेरे लिए अच्छा काम करता है: github.com/kdodia/snippets/blob/master/ipsh.py
karan.dodia

1
मुझे import inspectकाम करने से पहले जोड़ने की जरूरत थी । कमांड लाइन अनुकूलन हालांकि मेरे लिए टूट गया लगता है।
पास्कल

7
सिर्फ उपयोग क्यों नहीं import ipdb; ipdb.set_trace()? शायद मुझे कुछ याद है, लेकिन मुझे आपके अधिक जटिल तरीके का फायदा नहीं दिख रहा है।
लूपर

19

आप आईपीथॉन सत्र की शुरुआत पुडब से कर सकते हैं और अपनी पसंद के अनुसार डिबगिंग सत्र में वापस जा सकते हैं।

BTW, ipdb पर्दे के पीछे IPython का उपयोग कर रहा है और आप वास्तव में TAB पूर्णता और जादू कमांड (एक के साथ शुरू होता है %) जैसे IPython कार्यक्षमता का उपयोग कर सकते हैं । यदि आप ipdb के साथ ठीक हैं, तो आप इसे %runऔर जैसे आदेशों का उपयोग करके IPython से शुरू कर सकते हैं %debug। ipdb सेशन वास्तव में सादे IPython से बेहतर है, इस अर्थ में कि आप स्टैक ट्रेस आदि में ऊपर और नीचे जा सकते हैं। "वस्तु निरीक्षण" के लिए ipdb में क्या कमी है?

इसके अलावा, python.el ने Emacs के साथ बंडल किया = = 24.3 में अच्छा ipdb सपोर्ट है।


1
धन्यवाद tkf मैं आपके Emacs-Jedi पैकेज का बहुत बड़ा प्रशंसक हूं। जब आपने कहा था कि Emacs 24.3 को ipdb के लिए अच्छा समर्थन है, तो क्या आप विस्तृत विचार करेंगे? मैं आमतौर पर IPython को एक अलग M-x ansi-termबफर में शुरू करता हूं , और फिर मैं अपने सोर्स बफ़र्स को IPython बफर में बाँधने के लिए isend-mode का उपयोग करता हूं ताकि मैं कीबोर्ड शॉर्टकट के साथ IPython दुभाषिया को कोड भेज सकूं जो स्वचालित रूप %pasteसे IPython बफर को जादू भेजता है । यह मुझे IPython के क्षेत्रों का शीघ्र परीक्षण करने की अनुमति देता है। मैं हमेशा इस IPython शेल से अपने प्रोग्राम चलाता हूं runऔर embed()बंद करने के लिए उपयोग करता हूं ।
एमेलियो वाज़क्वेज़-रीना

3
उदाहरण के लिए, जब आप कोड के माध्यम से कदम रखते हैं, तो स्रोत कोड दूसरे बफर में वर्तमान निष्पादन बिंदु को इंगित करते हुए तीर के साथ खोला जाता है। आपके पास सेंड-रीजन कमांड भी है, जैसे कि आप इसेंड-मोड के साथ करते हैं।
tkf

धन्यवाद @tkf मैं एक ipdbडीबगिंग सत्र का उपयोग कैसे शुरू कर सकता हूं python.elऔर send-regionसंबंधित शेल आदि जैसी चीजें हैं ? सामान्य तौर पर, मुझे इस पर अधिक जानकारी कहां मिल सकती है?
एमेलियो वाज़केज़-रीना

मैं का उपयोग करें %runया %debug। मुझे लगता है कि import ipdb; ipdb.set_trace()काम भी करता है। मुझे नहीं लगता कि आप ipdb को कई लाइनें भेज सकते हैं। यह ipdb की सीमा है। लेकिन शायद %pasteट्रिक काम करती है। आप आईपीथॉन देव को एक सुविधा अनुरोध भेजना चाह सकते हैं।
tkf

13

ऐसा लगता है कि @ गैबरस के उत्तर के दृष्टिकोण को हटा दिया गया है

नया दृष्टिकोण प्रतीत होता है:

from IPython.core import debugger
debug = debugger.Pdb().set_trace

def buggy_method():
    debug()

क्या यह आपको ipdbडीबगिंग के दौरान ipython शेल के भीतर स्टेटमेंट्स का उपयोग करने की अनुमति देता है ?
अल्फा_989

6

एक उपसर्ग "!" pdb में टाइप करने वाले कमांड का प्रतीक आइपीथॉन शेल में कुछ करने जैसा प्रभाव डालता है। यह एक निश्चित फ़ंक्शन या यहां तक ​​कि चर नामों के लिए सहायता तक पहुंचने के लिए काम करता है। शायद यह आपको कुछ हद तक मदद करेगा। उदाहरण के लिए,

ipdb> help(numpy.transpose)
*** No help on (numpy.transpose)

लेकिन! सहायता (numpy.transpose) आपको numpy.transpose पर अपेक्षित सहायता पृष्ठ देगी। इसी प्रकार, चर नामों के लिए, मान लीजिए कि आपके पास एक चर l है, pdb में "l" टाइप करने से कोड सूचीबद्ध होता है, लेकिन l, l के मान को प्रिंट करता है।


2
यह एक बुरा pdb gotcha है, और इसके बारे में जानने लायक है।
विल्फ्रेड ह्यूजेस

4

क्या आपने इस टिप को आजमाया ?

या बेहतर अभी भी, ipython का उपयोग करें, और कॉल करें:

from IPython.Debugger import Tracer; debug_here = Tracer()

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

debug_here()

जब भी आप एक ब्रेकपॉइंट सेट करना चाहते हैं


4

आप IPython भीतर से शुरू कर सकते हैंipdb !

ipdbडिबगर 1 का संकेत दें :

import idpb; ipdb.set_trace()

कंसोल 2 में भीतर से IPython डालें :ipdb>

from IPython import embed; embed()

पर लौटें ipdb>के भीतर से सांत्वना IPython:

exit

यदि आप Emacs का उपयोग करने के लिए पर्याप्त भाग्यशाली हैं, तो चीजों को और अधिक सुविधाजनक बनाया जा सकता है!

इसके उपयोग की आवश्यकता है M-x shell। का उपयोग करना yasnippetऔर बीएम , निम्नलिखित स्निपेट को परिभाषित करें। यह ipdbसंपादक के पाठ को set-traceपंक्ति के साथ बदल देगा । स्निपेट डालने के बाद, लाइन को हाइलाइट किया जाएगा ताकि यह आसानी से ध्यान देने योग्य और नेविगेट करने योग्य हो। M-x bm-nextनेविगेट करने के लिए उपयोग करें।

# -*- mode: snippet -*-
# name: ipdb
# key: ipdb
# expand-env: ((yas-after-exit-snippet-hook #'bm-toggle))
# --
import ipdb; ipdb.set_trace()

1 आसान विलोपन के लिए सभी एक लाइन पर। चूंकि importsकेवल एक बार होता है, इस फॉर्म ipdbको आयात किया जाता है जब आपको बिना किसी अतिरिक्त ओवरहेड के इसकी आवश्यकता होती है।

2 आप IPython अपनी .pdbrcफ़ाइल में आयात करके अपने आप को कुछ टाइपिंग से बचा सकते हैं :

try:
    from IPython import embed
except:
    pass

यह आपको केवल embed()भीतर से कॉल करने की अनुमति देता है ipdb(ज़ाहिर है, केवल जब IPython स्थापित है)।


3

एक विकल्प स्पाइडर की तरह एक आईडीई का उपयोग करना है जो आपको डीबग करते समय (वास्तव में, एक IPython कंसोल का उपयोग करके) अपने कोड के साथ बातचीत करने की अनुमति देनी चाहिए। वास्तव में, स्पाइडर बहुत MATLAB की तरह है, जो कि मुझे लगता है कि जानबूझकर था। जिसमें वेरिएबल इंस्पेक्टर, वेरिएबल एडिटिंग, बिल्ट-इन एक्सेस टू डॉक्यूमेंटेशन आदि शामिल हैं।


3

प्रश्न के लिए सही, आसान, शांत, सटीक उत्तर -d फ्लैग के साथ% रन मैक्रो का उपयोग करना है।

In [4]: run -d myscript.py
NOTE: Enter 'c' at the ipdb>  prompt to continue execution.        
> /cygdrive/c/Users/mycodefolder/myscript.py(4)<module>()
      2                                                            
      3                        
----> 4 a=1                                            
      5 b=2

यह अधिक होना चाहिए। अगर मुझे अपने कोड में (एक मॉड्यूल के भीतर) एक लाइन डालने की आवश्यकता है, तो मुझे मॉड्यूल को पुनः लोड करने के लिए IPython को पुनरारंभ करना होगा। इस के अलावा, मैं सिर्फ %save /tmp/foo.py x-yउस कोड को चला सकता %run -d /tmp/foo.pyहूं जिसे मैं चलाना चाहता हूं और डिबग करना चाहता हूं और फिर मुझे जहां भी पसंद है वहां ब्रेकपॉइंट सेट करना है। बहुत बढ़िया जवाब!
रोमियो वैलेंटाइन

2

यदि आप एम्बेड में () से बाहर निकलें टाइप करते हैं (कोड को सांत्वना देते हैं और अगले एम्बेड पर जाएँ)।


2

Pyzo आईडीई समान क्षमताओं के रूप में ओ पी के लिए कहा है। आपको डिबग मोड में शुरू करने की आवश्यकता नहीं है। MATLAB के समान, कमांड शेल में निष्पादित होते हैं। जब आप कुछ स्रोत कोड लाइन में ब्रेक-पॉइंट सेट करते हैं, तो IDE निष्पादन को रोक देता है और आप नियमित रूप से IPython कमांड को डिबग और जारी कर सकते हैं।

हालाँकि ऐसा लगता है कि स्टेप-इन (अभी तक?) अच्छी तरह से काम नहीं करता है (यानी एक पंक्ति में रुकना और फिर दूसरे फ़ंक्शन में कदम रखना) जब तक कि आप एक और ब्रेक-पॉइंट सेट न करें।

फिर भी, MATLAB से आ रहा है, यह मुझे मिला सबसे अच्छा समाधान लगता है।


2

Python 3.2 से, आपके पास interactकमांड है, जो आपको पूर्ण अजगर / ipython कमांड स्पेस तक पहुंच देती है।


1

Emacs 'IPython- शेल के अंदर से चल रहा है और pdb.set_trace () के माध्यम से सेट किए गए ब्रेकप्वाइंट पर काम करना चाहिए।

अजगर- mode.el, Mx ipython RET आदि के साथ जांच की गई।


1

नया कोड विकसित करना

IPython के अंदर डिबगिंग

  1. प्रयोग पुनरावृत्तियों को गति देने के लिए ज्यूपिटर / आईपीथॉन सेल निष्पादन का उपयोग करें
  2. के माध्यम से कदम के लिए %% डिबग का उपयोग करें

सेल उदाहरण:

%%debug
...: for n in range(4):
...:    n>2

मौजूदा कोड डिबगिंग

डिबगिंग के अंदर IPython

  1. टूटी हुई इकाई परीक्षण को डीबग करना: pytest ... --pdbcls=IPython.terminal.debugger:TerminalPdb --pdb
  2. परीक्षण मामले के बाहर डिबगिंग: breakpoint(), python -m ipdb, आदि
  3. IPython.embed () पूर्ण IPython कार्यक्षमता के लिए जहां डिबगर में आवश्यक है

पायथन पर विचार

मैं ओपी से सहमत हूं कि कई चीजें MATLAB अच्छी तरह से पाइथन करती हैं और अभी भी वास्तव में नहीं होनी चाहिए क्योंकि भाषा के बारे में सब कुछ उत्पादन की गति पर विकास की गति का पक्षधर है। शायद किसी दिन मैं CPython को तुच्छ बग फिक्स से अधिक योगदान दूंगा।

https://github.com/ipython/ipython/commit/f042f3fea7560afcb518a1940daa46a72fbcfa68

यह भी देखें कि क्या डिबगिंग के साथ आईपीथॉन में कमांड चलाना संभव है?

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