Làm thế nào để bạn thấy toàn bộ lịch sử lệnh trong Python tương tác?


149

Tôi đang làm việc với trình thông dịch python mặc định trên Mac OS X và tôi Cmd+ K(đã xóa) các lệnh trước đó của mình. Tôi có thể lần lượt đi qua chúng bằng các phím mũi tên. Nhưng có một tùy chọn như tùy chọn --history trong bash shell, hiển thị cho bạn tất cả các lệnh bạn đã nhập cho đến nay?


Lệnh historyshell là một chương trình như bất kỳ chương trình nào khác. Nó không phải là một "tùy chọn" trong bashlệnh.
Niloct

6
Để được chính xác: historylà một vỏ dựng sẵn.
blinry

3
Đối với iPython câu trả lời là %history. Và -gtùy chọn được phiên trước đó .
Bob Stein

% history -g +% chỉnh sửa hoạt động tốt nhất
Dyno Fu

Câu trả lời:



250

Mã để in toàn bộ lịch sử:

Con trăn 3

One-liner (sao chép và dán nhanh):

import readline; print('\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())]))

(Hoặc phiên bản dài hơn ...)

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

Con trăn 2

One-liner (sao chép và dán nhanh):

import readline; print '\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())])

(Hoặc phiên bản dài hơn ...)

import readline
for i in range(readline.get_current_history_length()):
    print readline.get_history_item(i + 1)

Lưu ý : get_history_item()được lập chỉ mục từ 1 đến n.


31
Một lớp lót:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
Matt

24
Câu trả lời này (và đối tác không phải là ví dụ của nó) cho thấy mức độ quan trọng của các ví dụ đối với mọi người. Cảm ơn.
Tim S.

8
Mát mẻ! Tôi đã thêm một history()hàm với ở trên trong tập lệnh khởi động trình thông dịch Python của tôi (một tập lệnh được chỉ ra bởi env. Var $PYTHONSTARTUP). Từ giờ trở đi, tôi có thể chỉ cần gõ history()bất kỳ phiên dịch nào ;-)
sxc731

2
Mỗi khi tôi quên, làm thế nào điều này được thực hiện, tôi đến đây để trả lời, cảm ơn Dennis.
Felipe Valdes

3
Tôi đã đóng vai chính này, người biết khi nào và tôi sẽ quay lại với sự tốt lành này một lần nữa. 👍🏽
Berto

45

Với trình thông dịch python 3, lịch sử được ghi vào
~/.python_history


Tôi không có thư mục này và tôi sử dụng Python 3.5.2

Điều này sẽ dành cho các hệ điều hành giống như Unix. Tôi đã có thể truy xuất lịch sử của mình trên macOS vớicat ~/.python_history
Ryan H.

1
Cảm ơn câu trả lời này. Sau này tôi đã tìm thấy điều này được đề cập trong các tài liệu ở đây: docs.python.org/3/l Library / site.html
Jason V.

4
Thật không may, lịch sử dường như không được cập nhật khi sử dụng môi trường ảo: - /
ChrisFreeman

4
Bạn cần phải có quit()trình thông dịch cho lịch sử phiên hiện tại để được đưa vào~/.python_history
plexoos

9

Nếu bạn muốn viết lịch sử vào một tệp:

import readline
readline.write_history_file('python_history.txt')

Hàm trợ giúp cho:

Help on built-in function write_history_file in module readline:

write_history_file(...)
    write_history_file([filename]) -> None
    Save a readline history file.
    The default filename is ~/.history.

điều này sẽ tiếp tục qua các phiên trăn như lịch sử tò mò của ruby?
lacostenycoder

Có thể câu trả lời này đã được viết trước hàm readline, nhưng tại sao không sử dụng readline.write_history_file? @lacostenycoder Bạn có thể sử dụng đường dẫn để đọc và ghi tệp lịch sử vẫn tồn tại.
Joe Holloway

@JoeHolloway Thật tuyệt, cảm ơn bạn! Tôi đã thay đổi câu trả lời!
Martin Thoma

4

Vì ở trên chỉ hoạt động cho python 2.x cho python 3.x (cụ thể là 3.5) là tương tự nhưng với một sửa đổi nhỏ:

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

lưu ý thêm ()

(sử dụng tập lệnh shell để phân tích cú pháp .python_history hoặc sử dụng python để sửa đổi mã trên là vấn đề sở thích cá nhân và tình huống imho)


3
Win10 C:\>python -m pip install readline=> Collecting readline\ n Downloading https://files.pythonhosted.org/packages/f4/01/2cf081af8d880b44939a5f1b446551a7f8d59eae414277fd0c303757ff1b/readline-6.2.4.1.tar.gz (2.3MB)\ n |████████████████████████████████| 2.3MB 1.7MB/s\ n ERROR: Complete output from command python setup.py egg_info:\ n ERROR: error: this module is not meant to work on Windows\ n ----------------------------------------\ n `ERROR: Lệnh" python setup.py egg_info "không thành công với mã lỗi 1 trong C: \ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdw \ readline`
bballdave025

1
@ bballdave025 Có, bạn không thể pip install readline, nhưng readlineđược cài đặt theo mặc định trên Windows.
Josiah Yoder

Vâng, điều đó làm cho mọi thứ dễ dàng hơn. Cảm ơn @JosiahYoder
bballdave025

@ bballdave025 Tôi đã biết rằng nó không được cài đặt mặc định trên windows, nhưng nếu bạn theo liên kết, các hướng dẫn sẽ cung cấp chi tiết - một cái gì đó như cài đặt pyreadline hoặc một cái gì đó.
Josiah Yoder

4

Trong IPython %history -gsẽ cung cấp cho bạn toàn bộ lịch sử lệnh. Cấu hình mặc định cũng lưu lịch sử của bạn vào một tệp có tên .python_history trong thư mục người dùng của bạn.


3

Một chức năng đơn giản để có được lịch sử tương tự như phiên bản unix / bash.

Hy vọng nó sẽ giúp một số người mới.

def ipyhistory(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        flen = len(str(hlen)) if not lastn else len(str(lastn))
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(": ".join([str(r if not lastn else r + lastn - hlen ).rjust(flen), readline.get_history_item(r)]))
    else:
        flen = len(str(-hlen))
        for r in range(1, -lastn + 1):
            print(": ".join([str(r).rjust(flen), readline.get_history_item(r)]))

Đoạn trích: Đã thử nghiệm với Python3. Hãy cho tôi biết nếu có bất kỳ trục trặc với python2. Mẫu:

Lịch sử đầy đủ: ipyhistory()

Lịch sử 10 lần trước: ipyhistory(10)

10 lịch sử đầu tiên: ipyhistory(-10)

Hy vọng nó sẽ giúp được.


chào, cảm ơn Tôi đã tạo đoạn mã của bạn thành một tệp xx.py. Sau khi mở python, tôi đã nhập xx. Tôi đã thử ipyhistory () nhưng nó nói, ">>> ipyhistory TracBack (cuộc gọi gần đây nhất): Tệp" <stdin> ", dòng 1, trong <module> NameError: tên 'ipyhistory' không được xác định". Chuyện gì vậy?
Chân Kim

Tôi đã sửa đổi điều này để không in số dòng vì chúng thường gây cản trở cho tôi, nhưng tôi thích khả năng giới hạn dòng. (Ngay cả trên Unix, tôi thường dùng cut -c 8chúng.)
Josiah Yoder

1

@ Jason-V, nó thực sự có ích, cảm ơn. Sau đó, tôi tìm thấy ví dụ này và sáng tác để sở hữu đoạn trích.

#!/usr/bin/env python3
import os, readline, atexit
python_history = os.path.join(os.environ['HOME'], '.python_history')
try:
  readline.read_history_file(python_history)
  readline.parse_and_bind("tab: complete")
  readline.set_history_length(5000)
  atexit.register(readline.write_history_file, python_history)
except IOError:
  pass
del os, python_history, readline, atexit 

1

Điều này sẽ cung cấp cho bạn các lệnh được in ra trong các dòng riêng biệt:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)

Bạn có thể vui lòng cụ thể hơn về định dạng mã? Bạn đang nói dấu ngoặc đơn không khớp?
Idea4life

Tôi đã sửa định dạng với một số thụt lề đơn giản. @AleksAndreev bạn có thể xóa downvote của bạn.
ChrisFreeman

0

Xem lại câu trả lời của Doogle không in số dòng, nhưng cho phép chỉ định số lượng dòng cần in.

def history(lastn=None):
    """
    param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
           Also takes -ve sequence for first n history records.
    """
    import readline
    assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
    hlen = readline.get_current_history_length()
    is_neg = lastn is not None and lastn < 0
    if not is_neg:
        for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
            print(readline.get_history_item(r))
    else:
        for r in range(1, -lastn + 1):
            print(readline.get_history_item(r))
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.