Etkileşimli Python'da tüm komut geçmişini nasıl görüyorsunuz?


150

Mac OS X'te varsayılan python yorumlayıcısı üzerinde çalışıyorum ve önceki komutlarımı I Cmd+ K(temizledim). Ok tuşlarını kullanarak bunları tek tek geçebilirim. Peki, bash kabuğunda --history seçeneği gibi, şimdiye kadar girdiğiniz tüm komutları gösteren bir seçenek var mı?


historyKabuk komut diğerleri gibi bir programdır. Komutta bir "seçenek" değil bash.
Niloct

6
Kesin olmak gerekirse: historybir kabuk yerleşiktir.
blinry

3
İçin ipython cevaptır %history. Ve -gseçenek daha önceki oturumları alır .
Bob Stein

% history -g +% edit en iyi çalışıyor
Dyno Fu

Yanıtlar:



251

Tüm geçmişi yazdırmak için kod:

Python 3

Tek astar (hızlı kopyalama ve yapıştırma):

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

(Veya daha uzun versiyon ...)

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

Python 2

Tek astar (hızlı kopyalama ve yapıştırma):

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

(Veya daha uzun versiyon ...)

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

Not : get_history_item()1'den n'ye endekslenir.


31
Bir astar:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
Matt

24
Bu cevap (ve onun örnek olmayan karşılığı) insanlar için örneklerin ne kadar önemli olduğunu örnekler. Teşekkürler.
Tim

8
Güzel! history()Python yorumlayıcı başlangıç ​​komut dosyasında (env. Var tarafından işaret edilen bir komut dosyası) yukarıdaki bir işlev ekledim $PYTHONSTARTUP. Şu andan itibaren, history()herhangi bir tercüman oturum
yazabilirim

2
Her unuttuğumda, bunun nasıl yapıldığını, cevap için geldim, teşekkürler Dennis.
Felipe Valdes

3
Ne zaman olduğunu bilenlere başladım ve bu iyiliği bir kez daha takmaya geri döndüm. 👍🏽
berto

45

Python 3 yorumlayıcısıyla tarih
~/.python_history


Bu dizine sahip değilim ve Python 3.5.2 kullanıyorum

Bu Unix benzeri işletim sistemleri için olurdu. MacOS ile tarihimi geri alabildimcat ~/.python_history
Ryan H.

1
Bu cevap için teşekkürler. Daha sonra bunu bu dokümanlarda buldum: docs.python.org/3/library/site.html#readline-configuration
Jason V.

4
Ne yazık ki, sanal ortamlar kullanılırken tarih güncellenmiyor gibi görünüyor: - /
ChrisFreeman

4
quit()Geçerli oturum geçmişinin dahil edilmesi için tercümana ihtiyacınız var~/.python_history
pleksoo

9

Geçmişi bir dosyaya yazmak istiyorsanız:

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

Yardım işlevi şunları sağlar:

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.

bu Ruby'nin gözetleme tarihi gibi python oturumlarında devam edecek mi?
lacostenycoder

Bu cevap belki readline fonksiyonundan önce yazılmıştı, ama neden readline.write_history_file kullanmıyorsunuz? @lacostenycoder Devam eden bir geçmiş dosyasını hem okumak hem de yazmak için readline'ı kullanabilirsiniz.
Joe Holloway

@JoeHolloway Harika, teşekkürler! Cevabı değiştirdim!
Martin Thoma

4

Yukarıdakiler sadece python 3.x için python 2.x (özellikle 3.5) için çalıştığından benzerdir, ancak küçük bir değişiklikle:

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

ekstra not ()

(.python_history'yi ayrıştırmak için kabuk komut dosyaları kullanmak veya yukarıdaki kodu değiştirmek için python kullanmak kişisel zevk ve durum meselesidir)


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 `HATA:" Python setup.py egg_info "komutu C: \ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdw hata kodu 1 ile başarısız oldu \ readline`
bballdave025

1
@ bballdave025 Evet, yapamazsınız pip install readline, ancak readlinevarsayılan olarak Windows'a yüklenir.
Josiah Yoder

Bu işleri kolaylaştırıyor. Teşekkürler @JosiahYoder
bballdave025

@ bballdave025 Windows'ta varsayılan olarak yüklenmediğini öğrendim, ancak bağlantıyı takip ederseniz, talimatlar ayrıntıları veriyor - pyreadline veya benzeri bir şey yüklemek gibi.
Josiah Yoder

4

IPython'da %history -gtüm komut geçmişini vermelisiniz. Varsayılan yapılandırma, geçmişinizi kullanıcı dizininizdeki .python_history adlı bir dosyaya da kaydeder.


3

Geçmişi unix / bash sürümüne benzetmek için basit bir işlev.

Umarım bazı yeni insanlara yardımcı olur.

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

Snippet: Python3 ile test edildi. Python2 ile herhangi bir aksaklık olup olmadığını bana bildirin. Örnekler:

Tam Geçmiş: ipyhistory()

Son 10 Tarih: ipyhistory(10)

İlk 10 Tarih: ipyhistory(-10)

Umarım dostlara yardımcı olur.


Merhaba teşekkürler. Kod pasajınızı xx.py bir dosyaya yaptım. sonra python açtıktan sonra xx ithal ettim. Sonra ipyhistory () denedim ama ">>> ipyhistory Traceback (son çağrı son):" <stdin> ", satır 1, <module> NameError: name 'ipyhistory' tanımlanmadı" diyor. Sorun nedir?
Chan Kim

Bunu genellikle benim için yol aldıkları için satır numaralarını yazdırmamak için revize ettim, ancak satır sınırlama yeteneğini beğendim. (Unix'te bile, genellikle cut -c 8onları dışarı
çıkarırım

1

@ Jason-V, gerçekten yardımcı oluyor, teşekkürler. sonra bu örnekleri buldum ve kendi parçacığım için besteledim.

#!/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

Bu size ayrı satırlarda yazdırılan komutları vermelidir:

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

Kodu biçimlendirme konusunda daha ayrıntılı bilgi verir misiniz? Parantezlerin eşleşmediğini mi söylüyorsunuz?
Idea4life

Biçimlendirmeyi basit bir girinti ile düzelttim. @AleksAndreev downvote'unuzu kaldırabilirsiniz.
ChrisFreeman

0

Arasında Rehash Doogle'sa Printline sayılar değil, fakat yazdırmak için satır sayısını belirterek izin vermez 'ın cevabı.

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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.