2009-07-27 53 views
14

Tôi muốn có thể "mũi tên lên" tới các lệnh mà tôi nhập vào trong trình thông dịch Python trước đó. Tôi đã tìm thấy mô-đun readline cung cấp các chức năng như: read_history_file, write_history_fileset_startup_hook. Tôi không đủ hiểu biết để đưa điều này vào thực tế, vì vậy ai đó có thể vui lòng giúp đỡ? Suy nghĩ của tôi về giải pháp là:Lịch sử dòng lệnh Python liên tục

(1) Sửa đổi .login PYTHONSTARTUP để chạy tập lệnh python. (2) Trong đó file python script làm điều gì đó như:

def command_history_hook(): 
    import readline 
    readline.read_history_file('.python_history') 
command_history_hook() 

(3) Bất cứ khi nào thoát phiên dịch, viết lịch sử để các tập tin. Tôi đoán là cách tốt nhất để làm điều này là để xác định một hàm trong kịch bản khởi động của bạn và thoát sử dụng chức năng rằng:

def ex(): 
    import readline 
    readline.write_history_file('.python_history') 
    exit() 

Nó rất khó chịu khi phải thoát khỏi sử dụng dấu ngoặc đơn, mặc dù: ex(). Có một số đường python có thể cho phép ex (không có dấu ngoặc) để chạy hàm ex không?

Có cách nào tốt hơn để khiến tệp lịch sử viết mỗi lần không? Cảm ơn trước cho tất cả các giải pháp/đề xuất.

Ngoài ra, có hai lựa chọn kiến ​​trúc như tôi có thể thấy. Một lựa chọn là có một lịch sử lệnh thống nhất. Điều bất lợi là các phiên dịch bạn chạy trong các thiết bị đầu cuối riêng biệt sẽ được phổ biến với lịch sử lệnh của nhau, và chúng sẽ ghi đè lên lịch sử của nhau. (điều này là ổn cho tôi vì tôi thường quan tâm đến việc đóng một thông dịch viên và mở lại ngay lập tức để tải lại các mô-đun, và trong trường hợp đó các lệnh của thông dịch viên sẽ được ghi vào tệp.) Một giải pháp có thể duy trì các tệp lịch sử riêng biệt cho mỗi thiết bị đầu cuối là viết một biến môi trường cho mỗi thiết bị đầu cuối mới mà bạn tạo:

def random_key() 
    ''.join([choice(string.uppercase + string.digits) for i in range(16)]) 

def command_history_hook(): 
    import readline 
    key = get_env_variable('command_history_key') 
    if key: 
     readline.read_history_file('.python_history_{0}'.format(key)) 
    else: 
     set_env_variable('command_history_key', random_key()) 

def ex(): 
    import readline 
    key = get_env_variable('command_history_key') 
    if not key: 
     set_env_variable('command_history_key', random_key()) 
    readline.write_history_file('.python_history_{0}'.format(key)) 
    exit() 

Bằng cách giảm độ dài khoá ngẫu nhiên từ 16 đến nói 1 bạn có thể giảm số lượng file xả rác thư mục của bạn đến 36 tại các chi phí của thể (2.8 % cơ hội) trùng lặp.

Trả lời

13

Tôi nghĩ rằng các đề xuất trong tài liệu Python khá nhiều bao gồm những gì bạn muốn. Hãy xem tệp pystartup ví dụ về cuối phần 13.3:

hoặc xem trang này:

Nhưng, đối với một trong số các vỏ tương tác hộp cung cấp tất cả điều này và nhiều hơn nữa, hãy xem sử dụng IPython:

+0

+1 cho iPython. –

+0

Cảm ơn, biến env PYTHONSTARTUP và hàm atexit.register là những gì tôi muốn. Dựa trên đầu vào của bạn, tuy nhiên, tôi có thể sẽ chỉ sử dụng iPython. cảm ơn! –

+0

Cảm ơn vì điều này. Bạn thật tuyệt vời. –

4

Thử sử dụng IPython làm vỏ trăn. Nó đã có mọi thứ bạn yêu cầu. Họ có gói cho các bản phân phối phổ biến nhất, vì vậy cài đặt nên rất dễ dàng.

+0

Đồng ý. Tôi đã sử dụng ipython một thời gian và nó là tuyệt vời, nó có tự động hoàn thành và tính năng lịch sử bạn đang tìm kiếm. – dalloliogm

+0

Tôi đang sử dụng IPython (trên Windows ngày hôm nay), nhưng khi tôi chạy nó, các phím mũi tên lên/xuống của tôi không cho tôi bất kỳ lịch sử lệnh nào. Tôi đang làm gì sai? –

+2

GIẢI PHÁP: 'easy_install pyreadline' để có các phím mũi tên lên/xuống duyệt lịch sử lệnh trên Windows. Cộng với một số thứ khác (như màu sắc!) Hoạt động ngay bây giờ. –

0

Sử dụng PIP để cài đặt các pyreadline gói:

pip install pyreadline 
+0

Tôi đã sử dụng đường dẫn cài đặt pip – Anoyz

0

Nếu tất cả các bạn muốn là sử dụng thay thế lịch sử tương tác mà không cần tất cả những thứ tập tin, tất cả các bạn cần làm là nhập khẩu readline:

import readline 

Và sau đó bạn có thể sử dụng phím lên/xuống để điều hướng lệnh qua cửa khẩu. Tương tự cho 2 hoặc 3.

Điều này không rõ ràng đối với tôi từ tài liệu, nhưng có thể tôi đã bỏ lỡ nó.

1

Lịch sử liên tục đã được hỗ trợ ra khỏi hộp kể từ Python 3.4. Xem this bug report.

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