¿Cómo guardar una sesión interactiva de Python?

Me encuentro con frecuencia utilizando el intérprete de Python para trabajar con bases de datos, archivos, etc., básicamente, mucho formato manual de datos semiestructurados. No guardo y limpio adecuadamente los bits útiles con la frecuencia que quisiera. ¿Hay alguna forma de guardar mi entrada en el shell (conexiones db, asignaciones de variables, poco para bucles y bits de lógica), algo de historia de la sesión interactiva? Si uso algo como un script , obtengo demasiado ruido de stdout. Realmente no necesito decapar todos los objetos, aunque si hay una solución que haga eso, estaría bien. Lo ideal sería que me dejaran con un script que se ejecutara como el que creé interactivamente, y podría eliminar los bits que no necesitaba. ¿Hay un paquete que hace esto, o un enfoque de bricolaje?

ACTUALIZACIÓN : Estoy realmente sorprendido por la calidad y la utilidad de estos paquetes. Para aquellos con una picazón similar:

  • IPython: debería haber estado usando esto durante años, una especie de lo que tenía en mente
  • reinteractar – muy impresionante, quiero aprender más sobre la visualización y esto parece que brillará allí. Algo así como una aplicación de escritorio gtk / gnome que muestra los gráficos en línea. Imagina un shell híbrido + calculadora gráfica + mini eclipse. Fuente de distribución aquí: http://www.reinteract.org/trac/wiki/GettingIt . Construido bien en Ubuntu, se integra también en los instaladores de escritorio gnome, Windows y Mac.
  • bpython – extremadamente bueno, muchas características agradables, autocompletar (!), rebobinar, una pulsación de tecla guardada en archivo, sangría, bien hecho. La distribución de fonts de Python, extrajo un par de dependencias de sourceforge.

Estoy convertido, estos realmente satisfacen una necesidad entre el intérprete y el editor.

IPython es extremadamente útil si te gusta usar sesiones interactivas. Por ejemplo, para su caso de uso está el comando %save magic , usted solo %save my_useful_session 10-20 23 para guardar las líneas de entrada 10 a 20 y 23 a my_useful_session.py (para ayudar con esto, cada línea tiene el prefijo de su número).

Además, la documentación establece:

Esta función utiliza la misma syntax como % de historial para los rangos de entrada, luego guarda las líneas en el nombre de archivo que especifique.

Esto permite, por ejemplo, hacer referencia a sesiones más antiguas, como

 %save current_session ~0/ %save previous_session ~1/ 

Mire los videos en la página de presentación para obtener una visión general rápida de las características.

http://www.andrewhjon.es/save-interactive-python-session-history

 import readline readline.write_history_file('/home/ahj/history') 

Hay una manera de hacerlo. Almacena el archivo en ~/.pystartup

 # Add auto-completion and a stored history file of commands to your Python # interactive interpreter. Requires Python 2.0+, readline. Autocomplete is # bound to the Esc key by default (you can change it - see readline docs). # # Store the file in ~/.pystartup, and set an environment variable to point # to it: "export PYTHONSTARTUP=/home/user/.pystartup" in bash. # # Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the # full path to your home directory. import atexit import os import readline import rlcompleter historyPath = os.path.expanduser("~/.pyhistory") def save_history(historyPath=historyPath): import readline readline.write_history_file(historyPath) if os.path.exists(historyPath): readline.read_history_file(historyPath) atexit.register(save_history) del os, atexit, readline, rlcompleter, save_history, historyPath 

y luego configure la variable de entorno PYTHONSTARTUP en su shell (por ejemplo, en ~/.bashrc ):

 export PYTHONSTARTUP=$HOME/.pystartup 

También puede agregar esto para obtener autocompletar de forma gratuita:

 readline.parse_and_bind('tab: complete') 

Tenga en cuenta que esto solo funcionará en sistemas * nix. Como readline solo está disponible en la plataforma Unix.

Si está utilizando IPython , puede guardar en un archivo todos sus comandos anteriores utilizando la función magic history% con el parámetro -f , pe:

 %history -f /tmp/history.py 

Después de instalar Ipython y abrir una sesión de Ipython ejecutando el comando:

 ipython 

desde su línea de comandos, simplemente ejecute el siguiente comando ‘mágico’ de Ipython para registrar automáticamente su sesión completa de Ipython:

 %logstart 

Esto creará un archivo .py con un nombre único y almacenará su sesión para usarla más tarde como una sesión interactiva de Ipython o para usarla en los scripts de su elección.

Además, reinteractar te brinda una interfaz similar a una notebook para una sesión de Python.

Además de IPython, una utilidad similar bpython tiene una función de “guardar el código que ingresó en un archivo”

Tuve que luchar para encontrar una respuesta, era muy nuevo en el entorno iPython.

Esto funcionara

Si tu sesión de iPython se ve así

 In [1] : import numpy as np .... In [135]: counter=collections.Counter(mapusercluster[3]) In [136]: counter Out[136]: Counter({2: 700, 0: 351, 1: 233}) 

Desea guardar líneas del 1 al 135 y luego en la misma sesión de ipython use este comando

 In [137]: %save test.py 1-135 

Esto guardará todas sus declaraciones de python en el archivo test.py en su directorio actual (donde inició el ipython).

Hay% history magic para imprimir y guardar el historial de entrada (y opcionalmente la salida).

Para almacenar su sesión actual en un archivo llamado my_history.py :

 >>> %hist -f my_history.py 

Historial IPython almacena tanto los comandos que ingresa como los resultados que produce. Puede pasar fácilmente por los comandos anteriores con las teclas de flecha hacia arriba y hacia abajo, o acceder a su historial de manera más sofisticada.

Puede usar la función% history magic para examinar entradas y salidas pasadas. El historial de entrada de las sesiones anteriores se guarda en una base de datos, e IPython se puede configurar para guardar el historial de salida.

Varias otras funciones mágicas pueden usar su historial de entrada, incluyendo% edit,% rerun,% recall,% macro,% save y% pastebin. Puedes usar un formato estándar para referirte a las líneas:

 %pastebin 3 18-20 ~1/1-5 

Esto tomará la línea 3 y las líneas 18 a 20 de la sesión actual, y las líneas 1-5 de la sesión anterior.

Ver% de historia? Para la Docstring y más ejemplos.

Además, asegúrese de explorar las capacidades de % store magic para la persistencia ligera de variables en IPython.

Almacena variables, alias y macros en la base de datos de IPython.

 d = {'a': 1, 'b': 2} %store d # stores the variable del d %store -rd # Refresh the variable from IPython's database. >>> d {'a': 1, 'b': 2} 

Para restaurar automáticamente las variables almacenadas en el inicio, especifique c.StoreMagic.autorestre = True en ipython_config.py.

Solo pongo otra sugerencia en el bol: Spyder.

introduzca la descripción de la imagen aquí

Tiene historial de registro y explorador de variables . Si has trabajado con MatLab, verás las similitudes.

En lo que respecta a Linux, se puede usar un comando de script para grabar toda la sesión. Es parte del paquete util-linux por lo que debería estar en la mayoría de los sistemas Linux. Puede crear un alias o una función que llamará script -c python y que se guardará en un archivo de script -c python . Por ejemplo, aquí hay una reimpresión de uno de esos archivos.

 $ cat typescript Script started on Sat 14 May 2016 08:30:08 AM MDT Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> print 'Hello Pythonic World' Hello Pythonic World >>> Script done on Sat 14 May 2016 08:30:42 AM MDT 

La pequeña desventaja aquí es que el script graba todo, incluso los saltos de línea, cada vez que pulsa backspaces, etc. Por lo tanto, es posible que desee usar col para limpiar la salida (consulte esta publicación en Unix y Linux Stackexchange ).

Hay otra opción — pyslice. en las “demostraciones y herramientas de wxpython 2.8 docs”, hay un progtwig de código abierto llamado “pyslices”.

puede usarlo como un editor, y también es compatible con el uso como una consola: ejecutar cada línea como un intérprete interactivo con eco inmediato.

por supuesto, todos los bloques de códigos y resultados de cada bloque se grabarán en un archivo txt automáticamente.

los resultados se registran justo detrás del bloque de código correspondiente. muy conveniente.

el resumen de pyslices

El comando %history es impresionante, pero desafortunadamente no te permitirá guardar las cosas que se hayan pegado% en la sesión. Para hacer eso, creo que tienes que hacer %logstart al principio (aunque no he confirmado que esto funcione).

Lo que me gusta hacer es

%history -o -n -p -f filename.txt

que guardará la salida, los números de línea y ‘>>>’ antes de cada entrada (opciones o, n y p). Vea los documentos para% historia aquí .

Algunos comentarios preguntaban cómo guardar todas las entradas de IPython a la vez. Para% save magic en IPython, puede guardar todos los comandos mediante progtwigción como se muestra a continuación, para evitar el mensaje de solicitud y también para evitar especificar los números de entrada. currentLine = len (In) -1% save -f my_session 1- $ currentLine

La opción -f se usa para forzar el reemplazo del archivo y el len(IN)-1 muestra la solicitud de entrada actual en IPython, lo que le permite guardar toda la sesión programáticamente.

Para aquellos que usan spacemacs e ipython que viene con python-layer , save magic crea una gran cantidad de resultados no deseados, debido al comando de autocompletado constante que funciona en spacemacs , como por ejemplo:

 len(all_suffixes) ';'.join(__PYTHON_EL_get_completions('''len''')) ';'.join(__PYTHON_EL_get_completions('''all_substa''')) len(all_substantives_w_suffixes) ';'.join(__PYTHON_EL_get_completions('''len''')) ';'.join(__PYTHON_EL_get_completions('''all''')) ';'.join(__PYTHON_EL_get_completions('''all_''')) ';'.join(__PYTHON_EL_get_completions('''all_w''')) ';'.join(__PYTHON_EL_get_completions('''all_wo''')) ';'.join(__PYTHON_EL_get_completions('''all_wor''')) ';'.join(__PYTHON_EL_get_completions('''all_word''')) ';'.join(__PYTHON_EL_get_completions('''all_words''')) len(all_words_w_logograms) len(all_verbs) 

Para evitar esto, simplemente guarde el búfer ipython como normalmente guarda cualquier otro: spc fs

Me gustaría sugerir otra forma de mantener la sesión de python a través de tmux en linux. ejecuta tmux, adjúntese a la sesión que abrió (si no se adjunta después de abrirla directamente). ejecuta python y haz lo que estés haciendo en él. luego desprenderse de la sesión. separarse de una sesión tmux no cierra la sesión. La sesión permanece abierta.

ventajas de este método: puede adjuntar a esta sesión desde cualquier otro dispositivo (en caso de que pueda ssh su PC)

contras de este método: este método no renuncia a los recursos utilizados por la sesión de python abierta hasta que realmente exista el intérprete de python.

Si usa bpython , todo su historial de comandos se guarda por defecto en ~/.pythonhist .

Para guardar los comandos para su reutilización posterior, puede copiarlos en un archivo de script de python:

 $ cp ~/.pythonhist mycommands.py 

Luego edite ese archivo para limpiarlo y colóquelo en la ruta de Python (paquetes de sitios del entorno virtual o virtual, directorio actual, mencionando en * .pth, o de alguna otra forma).

Para incluir los comandos en su shell, solo impórtelos desde el archivo guardado:

 >>> from mycommands import * 

Para guardar entrada y salida en XUbuntu :

  1. En XWindows, ejecute iPython desde la aplicación de terminal Xfce
  2. haga clic en Terminal en la barra de menú superior y busque save contents en el menú desplegable

Encuentro que esto guarda la entrada y la salida, yendo desde el momento en que abrí el terminal. Esto no es específico de ipython y funcionaría con sesiones ssh u otras tareas ejecutadas desde la ventana del terminal.