यह आपकी प्रक्रिया को बाधित करेगा (जब तक कि आप इसे एक सूत्र में शुरू नहीं करते), लेकिन आप codeपायथन कंसोल को शुरू करने के लिए मॉड्यूल का उपयोग कर सकते हैं :
import code
code.interact()
यह तब तक ब्लॉक रहेगा जब तक कि उपयोगकर्ता इंटरैक्टिव कंसोल को निष्पादित करके बाहर नहीं निकलता है exit()।
codeमॉड्यूल कम से कम अजगर v2.6, शायद दूसरों में उपलब्ध है।
मैं अपने लिनक्स काम के लिए संकेतों के साथ संयोजन में इस दृष्टिकोण का उपयोग करता हूं (विंडोज के लिए, नीचे देखें)। मैं इसे अपनी पायथन लिपियों में सबसे ऊपर रखता हूँ:
import code
import signal
signal.signal(signal.SIGUSR2, lambda sig, frame: code.interact())
और फिर इसे शेल से ट्रिगर करें kill -SIGUSR2 <PID>, जहां <PID>प्रक्रिया आईडी है। प्रक्रिया तब जो कुछ भी कर रही है उसे रोकता है और एक कंसोल प्रस्तुत करता है:
Python 2.6.2 (r262:71600, Oct 9 2009, 17:53:52)
[GCC 3.4.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
आम तौर पर वहाँ से मैं उत्कृष्ट WinPDB की तरह एक दूरस्थ डिबगर के सर्वर-साइड घटक को लोड करूँगा ।
विंडोज एक POSIX -compliant OS नहीं है, और इसलिए यह लिनक्स के समान संकेत प्रदान नहीं करता है। हालाँकि, Python v2.2 और इसके बाद का संस्करण एक Windows- विशिष्ट संकेतSIGBREAK (ट्रिगर दबाकर CTRL+ Pause/Break) को उजागर करता है । यह सामान्य + ( ) ऑपरेशन में हस्तक्षेप नहीं करता है , और इसलिए यह एक आसान विकल्प है।CTRLCSIGINT
इसलिए एक पोर्टेबल, लेकिन थोड़ा बदसूरत, उपरोक्त संस्करण है:
import code
import signal
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR2"),
lambda sig, frame: code.interact()
)
इस दृष्टिकोण के लाभ:
- कोई बाहरी मॉड्यूल (सभी मानक पायथन सामान)
- ट्रिगर होने तक किसी भी संसाधन का उपभोग करता है (2x आयात)
यहाँ मैं अपने उत्पादन वातावरण में कोड का उपयोग करता हूं जो WinPDB (यदि उपलब्ध हो) के सर्वर-साइड को लोड करेगा और पायथन कंसोल को खोलने के लिए वापस आ जाएगा।
def debug_signal_handler(signal, frame):
del signal
del frame
try:
import rpdb2
print
print
print "Starting embedded RPDB2 debugger. Password is 'foobar'"
print
print
rpdb2.start_embedded_debugger("foobar", True, True)
rpdb2.setbreak(depth=1)
return
except StandardError:
pass
try:
import code
code.interact()
except StandardError as ex:
print "%r, returning to normal program flow" % ex
import signal
try:
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR1"),
debug_signal_handler
)
except ValueError:
pass