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_file
và set_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.
+1 cho iPython. –
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! –
Cảm ơn vì điều này. Bạn thật tuyệt vời. –