thả vào trình thông dịch python trong khi thực thi chức năng


90

tôi có một mô-đun python với một chức năng:

def do_stuff(param1 = 'a'):
    if type(param1) == int:
        # enter python interpreter here
        do_something()
    else:
        do_something_else()

có cách nào để đưa vào trình thông dịch dòng lệnh nơi tôi có nhận xét không? để nếu tôi chạy đoạn sau trong python:

>>> import my_module
>>> do_stuff(1)

tôi nhận được lời nhắc tiếp theo của mình trong phạm vi và ngữ cảnh nơi tôi có nhận xét do_stuff()?


Câu trả lời:


60

Chèn

import pdb; pdb.set_trace()

sẽ nhập trình gỡ lỗi python tại thời điểm đó

Xem tại đây: http://docs.python.org/library/pdb.html


pdblà trăn vani tuyệt vời; nếu bạn có chỗ cho mang về một gói bên ngoài, ipdblà rất tốt - nhiều chức năng giống như các chương trình gỡ rối, nhưng với sự nổi bật cú pháp, hoàn thành tab, vv của ipython
khstacking

Cập nhật - ipdbđã bị phản đối, hiện nay tôi sử dụng pdbpp( pdb++) , trong đó có tính năng tương tự, và các công trình với import pdb; pdb.set_trace()(tức là nó vá nhập khẩu đó, vì vậy nó là một thả thay thế)
driftcatcher

@hangtwenty: sao bạn nói ipdbkhông dùng nữa? Tôi không thể tìm thấy bất kỳ tin tức nào về điều đó.
Nick Matteo

@Kundor hả, bạn nói đúng. Tôi nhớ rõ ràng đã đọc ở đâu đó rằng các tác giả đã quyết định ngừng duy trì dự án và chỉ sang một dự án khác để sử dụng thay thế. Có lẽ điều đó xảy ra một chút và sau đó nó được sống lại? Tôi có thể sai! Trong cả hai trường hợp, tôi rất thích ipdbtrước đây, nhưng đã được hưởng pdbpptừ
driftcatcher

141

Nếu bạn muốn một lời nhắc tương tác tiêu chuẩn (thay vì trình gỡ lỗi, như được hiển thị bởi prestomation), bạn có thể thực hiện điều này:

import code
code.interact(local=locals())

Xem: mô-đun mã .

Nếu bạn đã cài đặt IPython và muốn có một trình bao IPython thay thế, bạn có thể thực hiện việc này cho IPython> = 0.11:

import IPython; IPython.embed()

hoặc cho các phiên bản cũ hơn:

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell(local_ns=locals())

27
đối với IPython> = 0.11, không có Shell mô-đun nào nữa trong IPython ... vì vậy hãy khởi động nó bằng cách sử dụng "import IPython; IPython.embed ()" để thay thế.
evandrix

Có thể tiếp tục sau khi vào không code.interact(), một la PDB c(ontinue)?
Nick T

4
code.interact()là một cuộc gọi chặn. Chương trình của bạn sẽ dừng và đợi kết thúc. Nếu bạn thoát khỏi trình thông dịch tương tác, chương trình của bạn sẽ tiếp tục với câu lệnh ngay sau đây.
Matt Anderson

1
Sự khác biệt giữa lời nhắc tương tác và trình gỡ lỗi là gì?
StockB

1
@StockB Đó là lời nhắc tương tác tiêu chuẩn làm cho nó trở nên quan trọng. Trình gỡ lỗi là một lời nhắc tương tác, nhưng nó không giống nhau. Trong PDB, bạn không thể làm báo cáo nhiều đường, được xây dựng trong helpchức năng sẽ bị thay thế, vv
kbrose

28

Nếu bạn muốn một trình thông dịch Python mặc định, bạn có thể làm

import code
code.interact(local=dict(globals(), **locals()))

Điều này sẽ cho phép truy cập vào cả người dân địa phương và toàn cầu.

Nếu bạn muốn sử dụng trình thông dịch IPython, IPShellEmbedgiải pháp đã lỗi thời . Hiện tại những gì hoạt động là:

from IPython import embed
embed()

8
cảm ơn, code.interact(local=dict(globals(), **locals()))là tốt hơn rất nhiều so với code.interact(local=locals())vì làm cho sau bạn lại nhập khẩu bao bì
s2t2

Câu trả lời này hoạt động tốt hơn cho tôi vì tôi đang sử dụng tập lệnh bash để gọi mã python của mình. Tôi không thể tương tác với mã python của mình bằng câu trả lời được chấp nhận. Cảm ơn!
jonathanking
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.