Bagaimana Anda melihat seluruh sejarah perintah dalam Python interaktif?

150

Saya sedang mengerjakan interpreter python default pada Mac OS X, dan saya Cmd+ K(membersihkan) perintah saya sebelumnya. Saya bisa melaluinya satu per satu menggunakan tombol panah. Tapi apakah ada opsi seperti opsi --history di bash shell, yang menunjukkan semua perintah yang Anda masukkan sejauh ini?

Lavanya
sumber
The historyperintah shell adalah program seperti yang lain. Ini bukan "opsi" dalam bashperintah.
Niloct
6
Tepatnya: historyadalah shell builtin.
blinry
3
Untuk iPython jawabannya adalah %history. Dan -gopsi mendapatkan sesi sebelumnya .
Bob Stein
% history -g +% edit paling berhasil
Dyno Fu
Hanya mengajukan pertanyaan yang setara untuk Windows 10
Josiah Yoder

Jawaban:

251

Kode untuk mencetak seluruh sejarah:

Python 3

One-liner (salin cepat dan tempel):

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

(Atau versi yang lebih panjang ...)

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

Python 2

One-liner (salin cepat dan tempel):

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

(Atau versi yang lebih panjang ...)

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

Catatan : get_history_item()diindeks dari 1 ke n.

Dennis Golomazov
sumber
31
Satu liner:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
Matt
24
Jawaban ini (dan yang bukan contoh) memberi contoh betapa pentingnya contoh bagi orang. Terima kasih.
Tim S.
8
Keren! Saya telah menambahkan history()fungsi dengan yang di atas dalam skrip startup interpreter Python saya (skrip yang ditunjukkan oleh env. Var $PYTHONSTARTUP). Mulai sekarang, saya cukup mengetik history()sesi interpreter apa pun ;-)
sxc731
2
Setiap kali saya lupa, bagaimana ini dilakukan, saya datang ke sini untuk jawabannya, terima kasih Dennis.
Felipe Valdes
3
Saya membintangi ini siapa yang tahu kapan dan saya kembali untuk merampas kebaikan ini sekali lagi. 👍🏽
berto
45

Dengan interpreter python 3 sejarah ditulis untuk
~/.python_history

Candide Guevara Marino
sumber
Saya tidak memiliki direktori ini dan saya menggunakan Python 3.5.2
Ini akan untuk OS seperti Unix. Saya dapat mengambil riwayat saya di macOS dengancat ~/.python_history
Ryan H.
1
Terima kasih atas jawaban ini. Saya kemudian menemukan ini tercakup dalam dokumen di sini: docs.python.org/3/library/site.html#readline-configuration
Jason V.
4
Sayangnya, sejarah sepertinya tidak diperbarui ketika menggunakan lingkungan virtual: - /
ChrisFreeman
4
Anda perlu quit()juru bahasa untuk riwayat sesi saat ini untuk dimasukkan dalam~/.python_history
plexoos
9

Jika Anda ingin menulis riwayat ke file:

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

Fungsi bantuan memberi:

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.
Martin Thoma
sumber
Apakah ini akan bertahan di seluruh sesi python seperti sejarah mangsa ruby?
lacostenycoder
Mungkin jawaban ini ditulis sebelum fungsi readline, tetapi mengapa tidak menggunakan readline.write_history_file? @ lacostenycoder Anda dapat menggunakan readline untuk membaca dan menulis file histori yang masih ada.
Joe Holloway
@ JoHolloway Cool, terima kasih! Saya sudah mengubah jawabannya!
Martin Thoma
4

Karena di atas hanya berfungsi untuk python 2.x untuk python 3.x (khusus 3.5) serupa tetapi dengan sedikit modifikasi:

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

perhatikan ekstra ()

(menggunakan skrip shell untuk mengurai .python_history atau menggunakan python untuk mengubah kode di atas adalah masalah selera pribadi dan situasi imho)

Jeff Cliff
sumber
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 `KESALAHAN: Perintah" python setup.py egg_info "gagal dengan kode kesalahan 1 dalam C: \ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdw \ readline`
bballdave025
1
@ bballdave025 Ya, Anda tidak bisa pip install readline, tetapi readlinediinstal secara default di Windows.
Josiah Yoder
Nah, itu membuat segalanya lebih mudah. Terima kasih @JosiahYoder
bballdave025
@ bballdave025 Saya sejak mengetahui bahwa itu tidak diinstal secara default di windows, tetapi jika Anda mengikuti tautan, instruksi memberikan rincian - sesuatu seperti menginstal pyreadline atau sesuatu.
Josiah Yoder
4

Dalam IPython %history -gharus memberi Anda seluruh sejarah perintah. Konfigurasi default juga menyimpan riwayat Anda ke file bernama .python_history di direktori pengguna Anda.

Yossarian42
sumber
3

Fungsi sederhana untuk mendapatkan riwayat yang mirip dengan versi unix / bash.

Semoga ini bisa membantu beberapa orang baru.

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)]))

Cuplikan: Diuji dengan Python3. Beritahu saya jika ada gangguan dengan python2. Sampel:

Sejarah Lengkap: ipyhistory()

10 Sejarah Terakhir: ipyhistory(10)

10 Sejarah Pertama: ipyhistory(-10)

Semoga ini bisa membantu teman.

Doogle
sumber
hai terima kasih Saya membuat cuplikan kode Anda menjadi file xx.py. kemudian setelah membuka python, saya mengimpor xx. Kemudian saya mencoba ipyhistory () tetapi mengatakan, ">>> Traceback ipyhistory (panggilan terakhir terakhir): File" <stdin> ", baris 1, dalam <module> NameError: nama 'ipyhistory' tidak didefinisikan". Apa yang salah?
Chan Kim
Saya telah merevisi ini untuk tidak mencetak nomor baris karena biasanya menghalangi saya, tetapi saya menyukai kemampuan membatasi garis. (Bahkan di Unix, saya biasanya cut -c 8mereka keluar.)
Josiah Yoder
1

@ Jason-V, ini sangat membantu, terima kasih. kemudian, saya menemukan contoh ini dan dibuat untuk memiliki cuplikan.

#!/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 
dzNET
sumber
1

Ini akan memberi Anda perintah yang dicetak dalam baris terpisah:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)
Idea4life
sumber
Bisakah Anda lebih spesifik memformat kode? Apakah Anda mengatakan tanda kurung tidak cocok?
Idea4life
Saya telah memperbaiki pemformatan dengan beberapa lekukan sederhana. @AleksAndreev Anda dapat menghapus downvote Anda.
ChrisFreeman
0

Pengulangan dari Doogle jawaban 's yang tidak nomor Printline, tetapi tidak memungkinkan menentukan jumlah baris untuk mencetak.

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))
Josiah Yoder
sumber