2009-08-06 37 views
6

Từ tài liệu Python:Làm thế nào để thiết lập sys.excepthook để gọi pdb trên toàn cầu trong python?

sys.excepthook(type, value, traceback)

Chức năng này in ra một traceback nhất định và ngoại lệ đối với sys.stderr.

Khi ngoại lệ được nêu ra và không bị bắt, thông dịch viên gọi sys.excepthook với ba đối số, lớp ngoại lệ, trường hợp ngoại lệ và đối tượng truy nguyên. Trong một phiên tương tác, điều này xảy ra ngay trước khi điều khiển được trả về dấu nhắc; trong một chương trình Python, điều này xảy ra ngay trước khi chương trình thoát. Việc xử lý các ngoại lệ cấp cao nhất như vậy có thể được tùy chỉnh bằng cách gán một hàm ba đối số khác cho sys.excepthook.

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

Làm thế nào để tôi sửa đổi này trên toàn cầu nên hành động mặc định là luôn gọi pdb? Có tệp cấu hình nào tôi có thể thay đổi không? Tôi không muốn quấn mã của tôi để làm điều này.

Trả lời

17

Dưới đây là những gì bạn cần

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

Ba cách, đầu tiên là đơn giản nhưng thô (Thomas Heller) - thêm dòng sau vào site-packages/sitecustomize.py:

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

Các thứ hai phức tạp hơn và kiểm tra chế độ tương tác (bỏ qua gỡ lỗi một cách kỳ lạ ở chế độ tương tác), từ 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 

Và thứ ba (mà luôn luôn bắt đầu gỡ rối trừ khi stdin hoặc stderr được chuyển hướng) bởi 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

Chính xác những gì tôi muốn, cảm ơn bạn. – saffsd

0

Hãy thử:

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

Tôi không nghĩ rằng đặt tên người gọi pdb 'excepthook' là khôn ngoan. –

1

Một lựa chọn khác là sử dụng ipython, mà tôi xem xét một phải có công cụ cho bất kỳ nhà phát triển python nào. Thay vì chạy script của bạn từ shell, hãy chạy nó từ ipython với% run. Khi một ngoại lệ xảy ra, bạn có thể gõ% debug để gỡ lỗi nó. (Ngoài ra còn có một tùy chọn để tự động gỡ lỗi bất kỳ ngoại lệ nào xảy ra, nhưng tôi quên nó là gì.)

Các vấn đề liên quan