2012-09-28 23 views
29

Có cách nào để bước vào dòng đầu tiên của hàm trong ipython không. Tôi tưởng tượng cái gì đó sẽ như thế nào:Bước vào một hàm trong IPython

%step foo(1, 2) 

chạy ipdb và đặt một breakpoint ở dòng đầu tiên của foo.

Nếu tôi muốn làm điều này bây giờ tôi phải đi đến mã nguồn của hàm và thêm một dòng import ipdb; ipdb.set_trace().

+1

Không có chức năng nào giống như '% bước'. Bạn có thể '% run -d' toàn bộ tập lệnh, nhưng bạn không thể làm điều tương tự cho một câu lệnh hoặc lệnh gọi hàm. Bạn có thể thủ công 'pdb.run (" foo (1, 2) ")' hoặc 'pdb.runcall (foo, 1, 2)'. – abarnert

+0

Tôi đã tự hỏi điều tương tự ngày hôm nay. Tôi sẽ sử dụng tất cả các thời gian nếu nó đã có sẵn. Đã đến lúc tìm hiểu nguồn iPython để xem nó có thể được triển khai như thế nào. –

+0

Có thể trùng lặp của [Có thể chạy các lệnh trong IPython với gỡ lỗi không?] (Https://stackoverflow.com/questions/9689378/is-it-possible-to-run-commands-in-ipython-with-debugging) –

Trả lời

42

ipdb đã có hỗ trợ cho runcall, runeval và chạy kể từ 0,7, đầu năm nay. Bạn có thể sử dụng nó giống như pdb.runcall:

In [1]: def foo(a, b): 
    ...:  print a + b 
    ...: 

In [2]: import ipdb 

In [3]: ipdb.runcall(foo, 1, 2) 
> <ipython-input-1-2e565fd9c4a4>(2)foo() 
     1 def foo(a, b): 
----> 2  print a + b 
     3 

ipdb> 
+0

Đó là khá nhiều những gì tôi cần. Cảm ơn bạn đã chỉ ra bản cập nhật 0.7, tôi đã có một phiên bản cũ hơn. Có nó có thể dễ dàng để thêm một ma thuật ipython trong đó sử dụng runcall. –

+8

Trên thực tế nó chỉ ra bạn không cần ipdb bên ngoài, bạn chỉ có thể làm 'từ IPython.core.debugger nhập khẩu Pdb; ipdb = Pdb() '. –

+1

Không phải là phương pháp thanh lịch nhất. Tôi mong đợi một chức năng ma thuật cho một nhu cầu chung như vậy. Tôi tự hỏi nếu nó không phải là một nhu cầu chung cho người dùng 'SciPy' ... –

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