(28 मई, 2016 को अद्यतन) Emacs में RealGUD का उपयोग करना
Emacs में किसी के लिए, यह थ्रेड दिखाता है कि ओपी (और अधिक) में वर्णित सभी चीजों का उपयोग कैसे किया जाए
- RealGUD नामक Emacs में एक नया महत्वपूर्ण डिबगर जो किसी भी डीबगर (सहित
ipdb
) के साथ काम कर सकता है ।
- 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)
निम्नलिखित तरीकों में से एक में आह्वान करता हूं :
- या तो एक पायथन प्रोग्राम चलाकर जो इस फ़ंक्शन को यूनिक्स शेल से आमंत्रित करता है
- या इसे सीधे IPython से मंगवाकर
इसके बावजूद कि मैं इसे कैसे लागू करता हूं, दुभाषिया उस रेखा पर रुक जाता है जो कहती है ipsh()
। एक बार जब आप कर रहे हैं, आप कर सकते हैं Ctrl-D
और पायथन निष्पादन को फिर से शुरू करेगा (आपके द्वारा किए गए किसी भी चर अपडेट के साथ)। ध्यान दें, यदि आप एक नियमित IPython IPython शेल (ऊपर केस 2) से कोड चलाते हैं, तो नए IPython शेल को उसी के अंदर नेस्टेड किया जाएगा, जिससे आपने इसे इनवाइट किया था, जो पूरी तरह से ठीक है, लेकिन इसके बारे में पता होना अच्छा है। किसी भी तरह, एक बार दुभाषिया के स्थान पर रुकने के बाद ipsh
, मैं a
(जो हो सकता है 2
) के मूल्य का निरीक्षण कर सकता हूं , देखें कि क्या फ़ंक्शन और ऑब्जेक्ट परिभाषित हैं, आदि।
समस्या:
ऊपर दिए गए समाधान का उपयोग आप अपने कोड में कहीं भी पाइथन को रोकने के लिए कर सकते हैं, और फिर आपको पूर्ण रूप से विकसित IPython दुभाषिया में छोड़ सकते हैं। दुर्भाग्य से यह स्क्रिप्ट को जोड़ने के बाद आपको ब्रेकप्वाइंट को जोड़ने या हटाने की अनुमति नहीं देता है, जो कि अत्यधिक निराशाजनक है। मेरी राय में, यह एकमात्र ऐसी चीज है जो आईपीथॉन को पायथन के लिए एक महान डिबगिंग टूल बनने से रोक रही है।
आप अभी के लिए सबसे अच्छा कर सकते हैं:
वर्कअराउंड को ipsh()
विभिन्न स्थानों पर एक प्राथमिकता देना है, जहां आप पाइथन इंटरप्रेटर को एक आईपीथॉन शेल (यानी ए breakpoint
) लॉन्च करना चाहते हैं । तब आप अलग-अलग पूर्व-परिभाषित, हार्ड-कोडेड "ब्रेकप्वाइंट" के बीच "कूद" सकते हैं Ctrl-D
, जो मौजूदा एम्बेडेड IPython शेल से बाहर निकल जाएगा और जब भी दुभाषिया अगली कॉल को हिट करेगा, तब बंद हो जाएगा ipsh()
।
यदि आप इस मार्ग पर जाते हैं, तो "डिबगिंग मोड" से बाहर निकलने और बाद के सभी ब्रेकपॉइंट्स को अनदेखा करने का एक तरीका है, इसका उपयोग करना है ipshell.dummy_mode = True
जो पायथन को उस ipshell
वस्तु के किसी भी बाद के तात्कालिकता को अनदेखा करेगा जो हमने ऊपर बनाया था।
!
कमांड है जो ब्रेकपॉइंट पर किसी भी अजगर कमांड को निष्पादित करता है