Cách đưa vào REPL (Đọc, Đánh giá, In, Vòng lặp) từ mã Python


108

Có cách nào để lập trình buộc tập lệnh Python thả vào REPL tại một điểm tùy ý trong quá trình thực thi của nó, ngay cả khi tập lệnh được khởi chạy từ dòng lệnh?

Tôi đang viết một chương trình vẽ sơ đồ nhanh và bẩn, tôi muốn đọc dữ liệu từ stdin hoặc một tệp, vẽ sơ đồ và sau đó thả vào REPL để cho phép tùy chỉnh âm mưu.

Câu trả lời:


104

Bạn có thể thử sử dụng tùy chọn tương tác cho python:

python -i program.py

Thao tác này sẽ thực thi mã trong program.py, sau đó chuyển đến REPL. Mọi thứ bạn xác định hoặc nhập ở cấp cao nhất của program.py sẽ có sẵn.


21
Khi bạn đã sẵn sàng chuyển sang mặt tối, ipython -i program.py luôn sẵn sàng hỗ trợ bạn.
joeforker

Ấn tượng và đơn giản.
Nishant

126

Tôi thường xuyên sử dụng cái này:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()

47
Bạn có thể làm điều đó thậm chí còn đơn giản hơn thế: nhập mã; code.interact (local = local ())
Steven Kryskalla 09/09/09

3
Trong vòng pdb, bạn có thể sử dụng interact.
gerrit

43

Đây là cách bạn nên làm điều đó (IPython> v0.11):

import IPython
IPython.embed()

Đối với IPython <= v0.11:

from IPython.Shell import IPShellEmbed

ipshell = IPShellEmbed()

ipshell() # this call anywhere in your program will start IPython

Bạn nên sử dụng IPython, Cadillac của Python REPLs. Xem http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

Từ tài liệu:

Nó cũng có thể hữu ích trong các tình huống máy tính khoa học, nơi thông thường bạn cần thực hiện một số phần tự động, tính toán chuyên sâu và sau đó dừng lại để xem dữ liệu, biểu đồ, v.v. Mở phiên bản IPython sẽ cho phép bạn toàn quyền truy cập vào dữ liệu và chức năng của mình, và bạn có thể tiếp tục thực thi chương trình sau khi đã hoàn tất phần tương tác (có thể dừng lại sau nhiều lần nếu cần).


3
IPython là rất tốt, nhưng nếu OP muốn một giải pháp chỉ sử dụng Python tích hợp sẵn, thì giải pháp code.InteractiveConsole () của Jason là cách bạn "nên" làm. :-)
Ben Hoyt

18

Để sử dụng iPython và chức năng của trình gỡ lỗi, bạn nên sử dụng ipdb ,

Bạn có thể sử dụng nó theo cách tương tự như pdb, với việc bổ sung:

import ipdb
ipdb.set_trace()

17

Bạn có thể khởi chạy trình gỡ lỗi:

import pdb;pdb.set_trace() 

Không chắc bạn muốn REPL cho cái gì, nhưng trình gỡ lỗi rất giống nhau.


3
Tôi nghi ngờ rằng anh ta muốn thực hiện các thay đổi trực tiếp đối với một quy trình đang chạy, à la Lisp.
Pinochle

1
Có cách nào để tiếp tục thực thi tập lệnh đã khởi chạy bạn vào pdb không?
Jeff Welling

1
Tôi có xu hướng viết đoạn mã bằng VIM được cài đặt sẵn bằng Python, lưu nó và sau đó làm một! Python -i% chẳng hạn. Hoặc pdb. Đó là một trường hợp sử dụng tốt.
Nishant

0

Tôi vừa làm điều này trong một trong những tập lệnh của riêng tôi (nó chạy bên trong một khuôn khổ tự động hóa là một công cụ PITA khổng lồ):

x = 0 # exit loop counter
while x == 0:
    user_input = raw_input("Please enter a command, or press q to quit: ")
    if user_input[0] == "q":
        x = 1
    else:
        try:
            print eval(user_input)
        except:
            print "I can't do that, Dave."
            continue

Chỉ cần đặt cái này ở bất cứ đâu bạn muốn có điểm ngắt và bạn có thể kiểm tra trạng thái bằng cách sử dụng cú pháp tương tự như trình thông dịch python (mặc dù nó dường như không cho phép bạn nhập mô-đun). Nó không thanh lịch lắm, nhưng nó không yêu cầu bất kỳ thiết lập nào khác.

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.