2009-08-06 20 views
6

अजगर डॉक्स से:मैं python में वैश्विक रूप से पीडीबी को आमंत्रित करने के लिए sys.excepthook कैसे सेट करूं?

sys.excepthook(type, value, traceback)

इस समारोह प्रिंट बाहर एक दिया ट्रैस बैक और sys.stderr को अपवाद।

जब कोई अपवाद उठाया जाता है और बेकार होता है, तो दुभाषिया sys.excepthook को तीन तर्क, अपवाद वर्ग, अपवाद उदाहरण और एक ट्रेसबैक ऑब्जेक्ट के साथ कॉल करता है। एक इंटरैक्टिव सत्र में यह संकेत होता है कि नियंत्रण में नियंत्रण वापस लौटाया जाता है; एक पायथन प्रोग्राम में यह प्रोग्राम से बाहर निकलने से ठीक पहले होता है। ऐसे शीर्ष-स्तरीय अपवादों का संचालन sys.excepthook पर एक और तीन-तर्क फ़ंक्शन निर्दिष्ट करके अनुकूलित किया जा सकता है।

http://docs.python.org/library/sys.html

मैं इस विश्व स्तर पर संपादित कर सकता तो डिफ़ॉल्ट कार्रवाई हमेशा pdb आह्वान करने के लिए है? क्या कोई कॉन्फ़िगरेशन फ़ाइल बदल सकती है? मैं ऐसा करने के लिए अपना कोड लपेटना नहीं चाहता हूं।

उत्तर

17

यहाँ तुम क्या

http://ynniv.com/blog/2007/11/debugging-python.html

तीन तरीके की जरूरत है, पहले सरल लेकिन कच्चे तेल (Thomas Heller) है - के लिए निम्न साइट-संकुल/sitecustomize.py जोड़ें:

import pdb, sys, traceback 
def info(type, value, tb): 
    traceback.print_exception(type, value, tb) 
    pdb.pm() 
sys.excepthook = info 

दूसरा अधिक परिष्कृत है, और cookbook:

से इंटरैक्टिव मोड (अजीब तरह से इंटरैक्टिव मोड में डिबगिंग को छोड़कर) के लिए जांच करता है
# code snippet, to be included in 'sitecustomize.py' 
import sys 

def info(type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty(): 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(type, value, tb) 
    else: 
     import traceback, pdb 
     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 

और तीसरा द्वारा (जो हमेशा डिबगर जब तक stdin या stderr पुनः निर्देशित कर रहे शुरू) ynniv

# code snippet, to be included in 'sitecustomize.py' 
import sys 

def info(type, value, tb): 
    if (#hasattr(sys, "ps1") or 
     not sys.stderr.isatty() or 
     not sys.stdin.isatty()): 
     # stdin or stderr is redirected, just do the normal thing 
     original_hook(type, value, tb) 
    else: 
     # a terminal is attached and stderr is not redirected, debug 
     import traceback, pdb 
     traceback.print_exception(type, value, tb) 
     print 
     pdb.pm() 
     #traceback.print_stack() 

original_hook = sys.excepthook 
if sys.excepthook == sys.__excepthook__: 
    # if someone already patched excepthook, let them win 
    sys.excepthook = info 
+0

बिल्कुल वही जो मैं चाहता था, धन्यवाद। – saffsd

0

प्रयास करें:

import pdb 
import sys 

def excepthook(type, value, traceback): 
    pdb.post_mortem(traceback) 

excepthook.old = sys.excepthook 
sys.excepthook = excepthook 

def raise_exception(): 
    raise_exception() 

raise_exception() 
+1

मुझे नहीं लगता कि पीडीबी कॉलर 'excepthook' नामकरण बुद्धिमान है। –

1

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