2009-09-08 33 views
85

Có cách nào để lập trình buộc một tập lệnh Python thả vào một REPL tại một điểm tùy ý trong quá trình thực hiện, ngay cả khi tập lệnh được khởi chạy từ dòng lệnh?Làm thế nào để thả vào REPL (Đọc, Đánh giá, In, Vòng lặp) từ mã Python

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

Trả lời

78

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

python -i program.py 

này sẽ thực thi mã trong program.py, sau đó đi đến REPL. Bất cứ điều gì bạn xác định hoặc nhập khẩu ở cấp cao nhất của program.py sẽ có sẵn.

+13

Khi bạn đã sẵn sàng chuyển sang mặt tối, ipython -i program.py có sẵn cho bạn. – joeforker

+0

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

+0

Bạn chỉ cần thổi tâm trí của tôi. – Bemmu

16

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

import pdb;pdb.set_trace() 

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

+3

Tôi nghi ngờ rằng anh ấy muốn thực hiện thay đổi trực tiếp cho 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 đã đưa bạn vào pdb không? –

+0

Tôi có xu hướng viết đoạn mã trong VIM instaed của Python lưu nó và sau đó làm một! Python -i% ví dụ. Hoặc pdb. Đó là một trường hợp sử dụng tốt. – Nishant

38

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

import IPython 
IPython.embed() 

Đố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, chiếc Cadillac của Python REPLs . Xem http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

Từ các tài liệu:

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

+3

IPython là tuyệt vời, nhưng nếu OP muốn một giải pháp chỉ sử dụng Python tích hợp, giải pháp code.InteractiveConsole() của Jason là cách bạn "nên" làm điều đó. :-) –

102

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

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

Tài liệu cho mô-đun "mã" có tại đây: http://docs.python.org/library/code.html –

+36

Bạn có thể làm điều đó thậm chí đơn giản hơn: nhập mã; code.interact (local = locals()) –

+1

Trong 'pdb', bạn có thể sử dụng' tương tác'. – gerrit

14

Để có được sử dụng ipython và chức năng của debugger bạn nên sử dụng ipdb,

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

import ipdb 
ipdb.set_trace() 
0

tôi chỉ làm điều này trong một trong những kịch bản của riêng tôi (nó chạy bên trong một khuôn khổ tự động hóa đó là một Pita rất lớn để công cụ):

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 nó ở bất cứ nơi nào bạn muốn, 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 phải là rất thanh lịch, nhưng nó không yêu cầu bất kỳ thiết lập khác.

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