2012-02-23 30 views
12

Tôi muốn phát xung quanh trong trình thông dịch python nhưng với một loạt các thiết lập nhập và đối tượng đã hoàn thành. Ngay bây giờ tôi đang khởi chạy trình thông dịch trên dòng lệnh và thực hiện công việc thiết lập mỗi lần. Có cách nào để khởi động trình thông dịch dòng lệnh với tất cả công việc khởi tạo đã hoàn thành không?chạy trình thông dịch dòng lệnh python với các lần nhập được nạp tự động

Ex:

# Done automatically. 
import foo 
import baz 
l = [1,2,3,4] 
# Launch the interpreter. 
launch_interpreter() 
>> print l 
>> [1,2,3,4] 

Trả lời

20

Bạn có thể tạo một kịch bản với mã bạn muốn chạy tự động, sau đó sử dụng python -i để chạy nó. Ví dụ, tạo ra một kịch bản (chúng ta hãy gọi nó script.py) với điều này:

import foo 
import baz 
l = [1,2,3,4] 

Sau đó chạy kịch bản

$ python -i script.py 
>>> print l 
[1, 2, 3, 4] 

Sau khi kịch bản đã hoàn thành chạy, trăn lá bạn trong một phiên tương tác với kết quả của kịch bản vẫn còn xung quanh.

Nếu bạn thực sự muốn thực hiện một số công việc mỗi lần khi chạy python, bạn có thể đặt biến môi trường PYTHONSTARTUP thành tập lệnh sẽ chạy mỗi khi bạn khởi động python. Xem tài liệu trên interactive startup file.

+1

Documents cho các tập tin khởi động tương tác hiện nay ở đây: https://docs.python.org/3/tutorial/appendix.html#the-interactive-startup-file –

0

Bạn có thể sử dụng tùy chọn -s khi bắt đầu dòng lệnh. Chi tiết được cung cấp trong tài liệu here

+0

này là dành cho IDLE, không cho một phiên điều khiển đơn giản, phải không? – DNA

+0

Vâng, đúng vậy. Đây là IDLE. – vaisakh

0

Tôi nghĩ rằng tôi biết bạn muốn làm gì. Bạn có thể muốn kiểm tra IPython, vì bạn không thể khởi động trình thông dịch python mà không đưa ra tùy chọn -i (ít nhất là không trực tiếp). Đây là những gì tôi đã làm trong dự án của tôi:

def ipShell(): 
    '''Starts the interactive IPython shell''' 
    import IPython 
    from IPython.config.loader import Config 
    cfg = Config() 
    cfg.TerminalInteractiveShell.confirm_exit = False 
    IPython.embed(config=cfg, display_banner=False) 
# Then add the following line to start the shell 
ipShell() 

Bạn cần phải cẩn thận, tuy nhiên, vì vỏ sẽ có không gian tên của module chức năng ipShell() được định nghĩa. Nếu bạn đặt định nghĩa trong tệp bạn chạy, thì bạn sẽ có thể truy cập vào số globals() mà bạn muốn. Có thể có các giải pháp khác để chèn vùng tên mà bạn muốn, b̶u̶t̶ ̶y̶o̶u̶ ̶w̶o̶u̶l̶d̶ ̶h̶a̶v̶e̶ ̶t̶o̶ ̶g̶i̶v̶e̶ ̶a̶r̶g̶u̶m̶e̶n̶t̶s̶ ̶t̶o̶ ̶t̶h̶e̶ ̶f̶u̶n̶c̶t̶i̶o̶n̶ ̶i̶n̶ ̶t̶h̶a̶t̶ ̶c̶a̶s̶e̶.

EDIT

Các giá trị mặc định chức năng sau đây để không gian tên của người gọi (__main__.__dict__).

def ipShell(): 
    '''Starts the interactive IPython shell 
    with the namespace __main__.__dict__''' 
    import IPython 
    from __main__ import __dict__ as ns 
    from IPython.config.loader import Config 
    cfg = Config() 
    cfg.TerminalInteractiveShell.confirm_exit = False 
    IPython.embed(config=cfg, user_ns=ns, display_banner=False) 

mà không có bất kỳ đối số nào khác.

2

Tôi gặp phải câu hỏi này khi cố gắng định cấu hình desk mới cho nghiên cứu của mình và nhận thấy rằng các câu trả lời ở trên không hoàn toàn phù hợp với mong muốn của tôi: chứa toàn bộ cấu hình bàn trong một tệp (nghĩa là tôi sẽ không tạo riêng biệt script.py theo đề xuất của @srgerg).

Đây là cách tôi đã kết thúc việc đạt được mục tiêu của tôi:

export PYTHONPATH=$READ_GEN_PATH:$PYTHONPATH 

alias prepy="python3 -i -c \" 
from naive_short_read_gen import ReadGen 
from neblue import neblue\"" 

Trong trường hợp này neblue là trong CWD (do đó không có phần mở rộng con đường là cần thiết ở đó), trong khi naive_short_read_gen là trong một thư mục bất kỳ trên hệ thống của tôi, được chỉ định qua $READ_GEN_PATH.

Bạn có thể làm điều này trong một dòng nếu cần: alias prepy=PYTHONPATH=$EXTRA_PATH:$PYTHONPATH python3 -i -c ....

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