2011-11-03 11 views
6

Gần đây tôi đã chuyển từ ipython0.10 sang ipython0.11. Trong ipython0.11, tôi chỉ thấy một đoạn nhỏ của truy nguyên đầy đủ khi trình gỡ rối python tham gia (tức là sử dụng %pdb), trong khi ở ipython0.10 tôi sẽ thấy toàn bộ dấu vết. Theo như tôi có thể nói, truy nguyên đầy đủ không thể truy cập trực tiếp từ dòng lệnh pdb - bạn có thể điều hướng qua nó bằng 'u' nhưng không thể xem trực tiếp.Trình gỡ rối ipython: traceback đầy đủ trên pdb tương tác?

Vì vậy, có cách nào để hiển thị toàn bộ lần truy nguyên không? Chẳng hạn như tham số cấu hình?

Hoặc, thậm chí hữu ích hơn, có cách nào để có ipython chỉ hiển thị Ngoại lệ đã bị bắt, thay vì hiển thị vị trí trong mã mà nó bị bắt không?

EDIT: Ví dụ:

In [1]: pdb 
Automatic pdb calling has been turned ON 

In [2]: 1/0 
> <ipython-input-2-05c9758a9c21>(1)<module>() 
    -1 1/0 

ipdb> q 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 
/Users/adam/<ipython-input-2-05c9758a9c21> in <module>() 
----> 1 1/0 

ZeroDivisionError: integer division or modulo by zero 

Tôi muốn xem các ZeroDivisionError trướcq 'ing ra khỏi pdb.

+1

Đây là lỗi trong IPython 0.11 - traceback được in sau khi bạn rời khỏi trình gỡ rối, thay vì trước khi nó bắt đầu. Nó sẽ được cố định cho 0,12 (nên được ra trước Giáng sinh). –

Trả lời

6

có cách nào để có ipython chỉ hiển thị Ngoại lệ đã bị bắt giữ, thay vì hiển thị vị trí trong mã mà nó bị bắt không?

Bạn có thể sử dụng sys.excepthook:

import sys 

def exc_hook(type, value, traceback): 
    print type 

sys.excepthook = exc_hook 

Từ sys module documentation:

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, 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 chỉ định một hàm khác là ba đối số cho sys.excepthook.

sys.__displayhook__
sys.__excepthook__

Những đối tượng chứa các giá trị ban đầu của displayhook và excepthook vào lúc bắt đầu của chương trình. Chúng được lưu để displayhook và excepthook có thể được khôi phục trong trường hợp chúng xảy ra để có được được thay thế bằng các đối tượng bị hỏng.


Bạn cũng có thể thử bắt đầu ipython với --xmode tùy chọn thiết lập để Plain

Từ IPython reference:

$ ipython [options] files 

--xmode=<modename> 

Chế độ báo cáo ngoại lệ.

Chế độ hợp lệ: Plain, Context and Verbose.

Đồng bằng: tương tự như in traceback bình thường của python.

Bối cảnh: in 5 dòng mã nguồn ngữ cảnh xung quanh mỗi dòng trong phần truy nguyên.

Verbose: tương tự Bối cảnh, nhưng bổ sung in các biến hiện có thể nhìn thấy nơi ngoại lệ xảy ra (rút ngắn chuỗi nếu quá dài). Điều này có thể có khả năng rất chậm, nếu bạn xảy ra để có cấu trúc dữ liệu lớn có biểu diễn chuỗi phức tạp để tính toán. Máy tính của bạn có thể bị treo trong một thời gian với việc sử dụng CPU ở mức 100%. Nếu điều này xảy ra, bạn có thể hủy truy xuất bằng Ctrl-C (có thể nhấn nhiều lần).

Dưới đây là một số ví dụ về cách sử dụng. Chú ý sự khác biệt trong dòng cho mỗi traceback:

--xmode=Plain:

[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Plain ipython-debugger-full-traceback-on-interactive-pdb.py 
------------------------------------------------------------ 
Traceback (most recent call last): 
    File "ipython-debugger-full-traceback-on-interactive-pdb.py", line 2, in <module> 
    1/0 
ZeroDivisionError: integer division or modulo by zero 

--xmode=Context:

[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Context ipython-debugger-full-traceback-on-interactive-pdb.py 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 

/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>() 
     1 
----> 2 #!/usr/bin/python 
     3 1/0 
     4 
     5 

ZeroDivisionError: integer division or modulo by zero 

--xmode=Verbose:

[ 19:54 [email protected] ~/SO/python ]$ ipython --xmode=Verbose ipython-debugger-full-traceback-on-interactive-pdb.py 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 

/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>() 
     1 
----> 2 #!/usr/bin/python 
     3 1/0 
     4 
     5 

ZeroDivisionError: integer division or modulo by zero 

Và không có quy định cụ thể một file py:

--xmode=Plain:

[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Plain 

In [1]: 1/0 
------------------------------------------------------------ 
Traceback (most recent call last): 
    File "<ipython console>", line 1, in <module> 
ZeroDivisionError: integer division or modulo by zero 

--xmode=Context:

[ 20:03 [email protected] ~/SO/python ]$ ipython --xmode=Context 

In [1]: 1/0 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 

/home/jon/SO/python/<ipython console> in <module>() 

ZeroDivisionError: integer division or modulo by zero 

--xmode=Verbose:

[ 20:01 [email protected] ~/SO/python ]$ ipython --xmode=Verbose 


In [1]: 1/0 
--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 

/home/jon/SO/python/<ipython console> in <module>() 

ZeroDivisionError: integer division or modulo by zero 

Using the Python debugger.

+0

Phần thứ hai của tin nhắn của bạn (--xmode) có vẻ giống như câu trả lời, nhưng nó dường như không hoạt động. Tôi đã thử cả 3 modenames và tracebacks đều giống nhau. Bất kỳ ý tưởng gì gây ra điều đó? – keflavich

+1

Xem các chỉnh sửa của tôi ở trên. – chown

+0

Cảm ơn. Thật không may, đó chỉ ra những gì có lẽ là một lỗi trong (bản sao của tôi?) Ipython: '$ ipython --xmode = Plain CẢNH BÁO: bí danh không được công nhận: 'xmode', nó có thể sẽ không có hiệu lực.' Tuy nhiên, một lần trong ipython : 'Trong [1]:% xmode Chế độ báo cáo ngoại lệ: Đồng bằng' hoạt động tốt – keflavich