¿Cómo ves todo el historial de comandos en Python interactivo?

150

Estoy trabajando en el intérprete de Python predeterminado en Mac OS X, y yo Cmd+ K(borré) mis comandos anteriores. Puedo revisarlos uno por uno usando las teclas de flecha. Pero, ¿hay una opción como la opción --history en bash shell, que muestra todos los comandos que ha ingresado hasta ahora?

Lavanya
fuente
El historycomando de shell es un programa como cualquier otro. No es una "opción" al bashmando.
Niloct
66
Para ser precisos: historyes una concha incorporada.
parpadeante
3
Para iPython la respuesta es %history. Y la -gopción obtiene sesiones anteriores .
Bob Stein
% history -g +% edit funciona mejor
Dyno Fu
Acabo de hacer la pregunta equivalente para Windows 10
Josiah Yoder,

Respuestas:

251

Código para imprimir todo el historial:

Python 3

One-liner (copiar y pegar rápidamente):

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

(O versión más larga ...)

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

Python 2

One-liner (copiar y pegar rápidamente):

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

(O versión más larga ...)

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

Nota : get_history_item()está indexado de 1 a n.

Dennis Golomazov
fuente
31
Un trazador de líneas:import readline; print '\n'.join([str(readline.get_history_item(i)) for i in range(readline.get_current_history_length())])
Matt
24
Esta respuesta (y su contraparte que no es un ejemplo) ejemplifica la importancia de los ejemplos para las personas. Gracias.
Tim S.
8
¡Frio! He agregado una history()función con lo anterior en mi script de inicio del intérprete de Python (un script al que apunta env. Var $PYTHONSTARTUP). De ahora en adelante, simplemente puedo escribir history()cualquier sesión de intérprete ;-)
sxc731
2
Cada vez que olvido cómo se hace esto, vengo aquí por la respuesta, gracias Dennis.
Felipe Valdés
3
Protagonicé esto quién sabe cuándo y estoy de vuelta para enganchar esta bondad una vez más. 👍🏽
berto
45

Con el intérprete de Python 3, la historia se escribe en
~/.python_history

Cándido Guevara Marino
fuente
No tengo este directorio y uso Python 3.5.2
Esto sería para sistemas operativos tipo Unix. Pude recuperar mi historial en macOS concat ~/.python_history
Ryan H.
1
Gracias por esta respuesta Más tarde encontré esto cubierto en los documentos aquí: docs.python.org/3/library/site.html#readline-configuration
Jason V.
44
Desafortunadamente, la historia no parece actualizarse cuando se usan entornos virtuales: - /
ChrisFreeman
44
Necesita que quit()el intérprete incluya el historial de la sesión actual~/.python_history
plexoos el
9

Si desea escribir el historial en un archivo:

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

La función de ayuda proporciona:

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
fuente
¿Esto persistirá en las sesiones de Python como la historia de palanca de Ruby?
lacostenycoder
Tal vez esta respuesta fue escrita antes de la función readline, pero ¿por qué no usar readline.write_history_file? @lacostenycoder Puede usar readline para leer y escribir un archivo de historial que persiste.
Joe Holloway
@JoeHolloway Cool, gracias! ¡He cambiado la respuesta!
Martin Thoma
4

Dado que lo anterior solo funciona para python 2.x para python 3.x (específicamente 3.5) es similar pero con una ligera modificación:

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

tenga en cuenta el extra ()

(el uso de scripts de shell para analizar .python_history o el uso de python para modificar el código anterior es una cuestión de gusto personal y situación)

Jeff Cliff
fuente
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: El comando" python setup.py egg_info "falló con el código de error 1 en C: \ Users \ dblack \ AppData \ Local \ Temp \ pip-install-s6m4zkdw \ readline`
bballdave025
1
@ bballdave025 Sí, no puede pip install readline, pero readlineestá instalado de forma predeterminada en Windows.
Josiah Yoder
Bueno, eso facilita las cosas. Gracias @JosiahYoder
bballdave025
@ bballdave025 Desde entonces supe que no está instalado por defecto en Windows, pero si sigues el enlace, las instrucciones dan detalles, como instalar pyreadline o algo así.
Josiah Yoder
4

En IPython %history -gdebería darte todo el historial de comandos. La configuración predeterminada también guarda su historial en un archivo llamado .python_history en su directorio de usuario.

Yossarian42
fuente
3

Una función simple para obtener el historial similar a la versión unix / bash.

Espero que ayude a algunas personas nuevas.

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

Fragmento: Probado con Python3. Avíseme si hay problemas técnicos con python2. Muestras:

Historia completa ipyhistory()

Últimos 10 historia: ipyhistory(10)

Primeros 10 historia: ipyhistory(-10)

Espero que ayude a los muchachos.

Doogle
fuente
Hola Gracias. Hice su fragmento de código en un archivo xx.py. Luego, después de abrir Python, importé xx. Luego probé ipyhistory () pero dice, ">>> ipyhistory Traceback (última llamada): Archivo" <stdin> ", línea 1, en <module> NameError: el nombre 'ipyhistory' no está definido". Que pasa
Chan Kim
He revisado esto para no imprimir números de línea, ya que generalmente se interponen en mi camino, pero me gustó la capacidad de limitación de línea. (Incluso en Unix, generalmente cut -c 8los elimino.)
Josiah Yoder
1

@ Jason-V, realmente ayuda, gracias. entonces, encontré estos ejemplos y compuse un fragmento propio.

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

Esto debería darle los comandos impresos en líneas separadas:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)
Idea4life
fuente
¿Puede ser más específico al formatear el código? ¿Estás diciendo que los paréntesis no coinciden?
Idea4life
He arreglado el formato con una simple sangría. @AleksAndreev puede eliminar su voto negativo.
ChrisFreeman
0

Repita la respuesta de Doogle que no imprime números de líneas, pero permite especificar el número de líneas para imprimir.

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
fuente