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?


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

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.


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


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.

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)


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.


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.


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 

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

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))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.