2009-07-27 13 views
14

Me gustaría poder "hacer una flecha arriba" a los comandos que ingresé en un intérprete de Python previo. Encontré el módulo readline que ofrece funciones como: read_history_file, write_history_file y set_startup_hook. Aunque no soy lo suficientemente inteligente como para poner esto en práctica, ¿alguien podría ayudarme? Mis pensamientos sobre la solución son:Historial de la línea de comandos de Python persistente

(1) Modifique .login PYTHONSTARTUP para ejecutar un script de python. (2) En ese archivo script en Python hacer algo como:

def command_history_hook(): 
    import readline 
    readline.read_history_file('.python_history') 
command_history_hook() 

(3) Siempre que las salidas de intérprete, escribir la historia en el archivo. Creo que la mejor manera de hacer esto es definir una función en el script de inicio y salida utilizando esa función:

def ex(): 
    import readline 
    readline.write_history_file('.python_history') 
    exit() 

Es muy molesto tener que salir el uso de paréntesis, sin embargo: ex(). ¿Hay algún azúcar python que permitiría ex (sin paréntesis) ejecutar la función ex?

¿Hay una mejor manera de hacer que el archivo de historial escriba cada vez? Gracias de antemano por todas las soluciones/sugerencias.

Además, hay dos opciones arquitectónicas que puedo ver. Una opción es tener un historial de comando unificado. El beneficio es la simplicidad (la alternativa que sigue almacena el directorio de inicio con muchos archivos). La desventaja es que los intérpretes que ejecuta en terminales separados se rellenarán con los historiales de comando de los demás y sobrescribirán los historiales de los demás. (Esto está bien para mí ya que normalmente estoy interesado en cerrar un intérprete y reabrir uno inmediatamente para volver a cargar los módulos, y en ese caso los comandos del intérprete se habrán escrito en el archivo). Una posible solución para mantener archivos de historial separados por terminal es escribir una variable de entorno para cada nueva terminal se crea:

def random_key() 
    ''.join([choice(string.uppercase + string.digits) for i in range(16)]) 

def command_history_hook(): 
    import readline 
    key = get_env_variable('command_history_key') 
    if key: 
     readline.read_history_file('.python_history_{0}'.format(key)) 
    else: 
     set_env_variable('command_history_key', random_key()) 

def ex(): 
    import readline 
    key = get_env_variable('command_history_key') 
    if not key: 
     set_env_variable('command_history_key', random_key()) 
    readline.write_history_file('.python_history_{0}'.format(key)) 
    exit() 

al disminuir la longitud de la clave aleatoria del 16 al decir 1 se podría reducir el número de archivos que cubrían sus directorios a 36 a expensas de una posible (2,8 % chance) de superposición.

Respuesta

13

Creo que las sugerencias en la documentación de Python cubren prácticamente lo que desea. Mira el ejemplo de archivo pystartup hacia el final de la sección 13.3:

o consulte esta página:

Pero, para una salida de la consola interactiva caja que ofrece todo esto y más, eche un vistazo al uso de IPython:

+0

+1 para iPython. –

+0

Gracias, la variable env PYTHONSTARTUP y la función atexit.register son lo que quería. De acuerdo con su entrada, sin embargo, probablemente solo esté usando iPython. ¡Gracias! –

+0

Gracias por esto. Eres increíble. –

4

Pruebe usar IPython como un shell de python. Ya tiene todo lo que pides. Tienen paquetes para las distribuciones más populares, por lo que la instalación debería ser muy fácil.

+0

De acuerdo. He estado usando ipython por un tiempo y es fantástico, tiene autocompletar y la función de historial que está buscando. – dalloliogm

+0

Estoy usando IPython (en Windows hoy), pero cuando lo ejecuto, mis teclas de flecha arriba/abajo no me dan ningún historial de comandos. ¿Qué estoy haciendo mal? –

+2

SOLUCIÓN: 'easy_install pyreadline' tiene teclas de flecha arriba/abajo para explorar el historial de comandos en Windows. Además algunas otras cosas (¡como los colores!) Funcionan ahora. –

0

Uso PIP para instalar el pyreadline paquete:

pip install pyreadline 
+0

Utilicé pip install readline – Anoyz

0

Si lo que quieres es utilizar la sustitución de historia interactiva sin todo el material de archivo, todo lo que tiene que hacer es la importación readline:

import readline 

Y a continuación, puede utilizar las teclas arriba/abajo para navi puerta de comandos pasados. Lo mismo para 2 o 3.

Esto no estaba claro para mí de los documentos, pero tal vez me lo perdí.

Cuestiones relacionadas