2013-01-31 19 views
28

Nói rằng tôi có một phiên IPython, từ đó tôi gọi một số kịch bản:Breakpoint gây ra gỡ lỗi tương tác của Python với IPython

> run my_script.py 

Có cách nào để tạo ra một breakpoint trong my_script.py mà từ đó tôi có thể kiểm tra không gian làm việc của tôi từ IPython?

Tôi nhớ đọc rằng trong các phiên bản trước của IPython người ta có thể làm:

from IPython.Debugger import Tracer;  

def my_function(): 
    x = 5 
    Tracer() 
    print 5; 

nhưng submodule Debugger dường như không còn khả dụng nữa.

Giả sử rằng tôi đã mở phiên IPython: làm cách nào để dừng chương trình của tôi một vị trí mà tôi chọn và kiểm tra không gian làm việc của tôi bằng IPython?

Nói chung, tôi muốn các giải pháp không yêu cầu tôi chỉ định số dòng, vì tôi muốn có thể có nhiều cuộc gọi như vậy đến Tracer() ở trên và không phải theo dõi số dòng nơi chúng là.

+0

Vì tò mò, tại sao bạn lại muốn nhiều hơn một trình theo dõi cùng một lúc? Tại thời điểm đó có vẻ như bạn nên làm việc đăng nhập, không gỡ lỗi. – Wilduck

+0

@Wilduck: Tôi muốn kiểm tra không gian làm việc của mình trong một số trường hợp nhất định và những trường hợp đó có thể xảy ra ở các vị trí khác nhau trong mã của tôi. –

+0

Được rồi, có lẽ tôi đã nói sai câu hỏi của tôi. Tôi hiểu lý do bạn muốn xem các phần khác nhau của mã. Tại sao bạn muốn có những dấu vết trong mã của bạn _at cùng một time_? Nếu bạn không sử dụng trình gỡ rối để sửa lỗi vĩnh viễn (tức là một lỗi tại một thời điểm), việc cài đặt ghi nhật ký có tự động tốt hơn/dễ dàng hơn hay không để thu thập thông tin về cách chương trình của bạn đang chạy ở các trạng thái khác nhau? Tôi hỏi vì có vẻ như bạn đang cố gắng sử dụng các công cụ gỡ lỗi cho việc ghi nhật ký nào đó. – Wilduck

Trả lời

27

Tracer() vẫn tồn tại trong ipython trong một mô-đun khác. Bạn có thể làm như sau:

Note ngoặc gọi thêm khoảng Tracer

chỉnh sửa: Traceris deprecated bạn nên sử dụng set_trace() thay

+1

@Arnon cách sử dụng 'set_trace()'; 'set_trace' nào? Đồng bằng cũ 'ipdb.set_trace()' tạo [vấn đề này cho tôi] (https://stackoverflow.com/q/35613249/1175496), mà nên sử dụng 'Tracer()()'! Ồ, có thể là 'Pdb.set_trace()' đã thấy [ở đây] (https://ipython.org/ipython-doc/rel-0.13.1/api/generated/IPython.core.debugger.html#IPython.core. debugger.Pdb.set_trace) hoặc [here] (https://stackoverflow.com/a/1127087/1175496); [tài liệu được liên kết] (http://ipython.readthedocs.io/en/stable/api/generated/IPython.core.debugger.html) mô tả 'IPython.core.debugger.set_trace', nhưng tôi không có func. –

+0

Tài liệu được liên kết là dành cho IPython 6 (chỉ hỗ trợ Python 3) và nghi ngờ của tôi là bạn đang sử dụng phiên bản cũ hơn. 'IPython.core.debugger.Tracer' vẫn tồn tại và hoạt động trong IPython 6, ngay cả khi không được chấp nhận. Tôi đoán bạn có thể tiếp tục sử dụng nó một thời gian cho đến khi nó thực sự được gỡ bỏ từ codebase. – pankaj

+0

Haha, đó là sự thật, tôi đang sử dụng 'Tracer' dù sao, hy vọng ai đó có thể mô tả các thay thế được đề nghị? –

5

Bên trong vỏ IPython, bạn có thể làm

from IPython.core.debugger import Pdb 
pdb = Pdb() 
pdb.runcall(my_function) 

ví dụ, hoặc làm bình thường pdb.set_trace() bên trong hàm của bạn.

+1

Cảm ơn, nhưng không rõ giải pháp đầu tiên sẽ cho phép tôi chỉ định ** vị trí có thể lựa chọn của tôi cho điểm ngắt ** như thế nào. Đối với phần thứ hai, tôi sẽ sử dụng tùy chọn đó như thế nào? Cuối cùng, từ những gì tôi hiểu, 'pdb' không cung cấp các tính năng tương tự mà IPython thực hiện để xem xét, vv. Điều đó có đúng không? –

+0

Bạn có thể sử dụng lệnh 'b' pdb để xác định các điểm ngắt khi bạn chạy trình gỡ rối. – Kos

15

Bạn có thể chạy nó và thiết lập một breakpoint tại một đường thẳng cho trước với:

run -d -b12 myscript 

đâu -b12 đặt một breakpoint tại dòng 12. Khi bạn nhập dòng này, bạn sẽ ngay lập tức thả vào pdb, và bạn cần nhập c để thực hiện đến điểm ngắt đó.

+0

Cảm ơn @Wildluck. Điều này chắc chắn hữu ích, mặc dù tôi quan tâm đến một cái gì đó mà không yêu cầu xác định số dòng. –

5

Tôi đã luôn luôn có cùng một câu hỏi và cách giải quyết tốt nhất mà tôi đã tìm thấy đó là hackey khá là thêm một dòng đó sẽ phá vỡ mã của tôi, như vậy:

... 
a = 1+2 
STOP 
... 

Sau đó, khi tôi chạy mã nó sẽ phá vỡ, và tôi có thể làm% debug để đến đó và kiểm tra. Bạn cũng có thể bật% pdb để luôn đi đến điểm mà mã của bạn bị hỏng nhưng điều này có thể khó chịu nếu bạn không muốn kiểm tra ở mọi nơi và mọi lúc mã của bạn bị hỏng. Tôi rất thích một giải pháp thanh lịch hơn.

7

Đây là phiên bản sử dụng phương pháp set_trace() thay vì không được chấp nhận Tracer() một.

from IPython.core.debugger import Pdb 

def my_function(): 
    x = 5 
    Pdb().set_trace() 
    print 5 
+0

Tôi muốn thêm câu trả lời này làm nhận xét cho câu trả lời được chấp nhận ở trên, nhưng tôi không có đủ danh tiếng để nhận xét, vì vậy tôi hy vọng nếu câu trả lời này giúp bất cứ ai –

+0

Hoặc bạn có thể trực tiếp sử dụng 'IPython.core.debugger.set_trace() 'mà không cần' Pdb'. –