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

416

Me encuentro con frecuencia usando el intérprete de Python para trabajar con bases de datos, archivos, etc., básicamente mucho formateo manual de datos semiestructurados. No guardo ni limpio correctamente los bits útiles con la frecuencia que quisiera. ¿Hay alguna manera de guardar mi entrada en el shell (conexiones db, asignaciones variables, poco para bucles y bits de lógica), algo de historial de la sesión interactiva? Si uso algo como script, obtengo demasiado ruido stdout. Realmente no necesito encurtir todos los objetos, aunque si hay una solución que lo haga, estaría bien. Idealmente, me quedaría con un script que se ejecutó como el que creé de forma interactiva, 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, algo de lo que tenía en mente
  • reinteract : muy impresionante, quiero aprender más sobre la visualización y parece que brillará allí. Una especie de aplicación de escritorio gtk / gnome que muestra gráficos en línea. Imagine una carcasa híbrida + calculadora gráfica + mini eclipse. Distribución de la fuente aquí: http://www.reinteract.org/trac/wiki/GettingIt . Construido bien en Ubuntu, se integra también en instaladores de escritorio gnome, Windows y Mac.
  • bpython : extremadamente genial, muchas características agradables, autocompletar (!), rebobinar, guardar una sola tecla en el archivo, sangrado, bien hecho. La distribución de código fuente de Python extrajo un par de dependencias de sourceforge.

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

desmontado
fuente

Respuestas:

411

IPython es extremadamente útil si te gusta usar sesiones interactivas. Por ejemplo, para su caso de uso, existe el %savecomando mágico , simplemente ingresa %save my_useful_session 10-20 23para 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 por su número).

Además, la documentación establece:

Esta función usa la misma sintaxis que % history 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 anteriores, como

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

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

Hormigas Aasma
fuente
11
¿Cómo guardar todas las líneas? Sin especificar el rango, crea un archivo vacío. :(
balki
40
@balki, el mensaje de IPython le dice cuántas líneas hay en su historial (es decir In[48]). Así save filename 1-48guardaría toda su sesión.
Ben Page
2
Además, ¿es posible volver a cargar este archivo en ipython y mantener intacto su historial de entrada?
Ben Page
15
@BenPage ¡Use "ipython -i [nombre de archivo]" en el archivo .py guardado, desde el indicador bash para cargar el archivo antes de regresar a una consola interactiva! (sin la bandera -i no obtienes la consola interactiva después de ejecutar el archivo).
Samuel Lampa
99
@ user4779, como cabría esperar:%load my_useful_session
Daniel Serodio
167

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

import readline
readline.write_history_file('/home/ahj/history')
Roberto Z
fuente
10
Crea un archivo vacío para mí en Windows 7
ubershmekel
10
Funcionó como un encanto para mí en Ubuntu.
Johndt6
44
@ubershmekel - Parece que solo funciona en Unix
Joel B
28
Falla en mi TI-83
Dan
1
Recuerde hacerlo al final de su sesión. La mía parecía un poco vacía después de llamar a la función solo al comienzo.
dolphus333
95

Hay una manera de hacerlo. Almacene 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 establezca la variable de entorno PYTHONSTARTUPen su shell (por ejemplo, en ~/.bashrc):

export PYTHONSTARTUP=$HOME/.pystartup

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

readline.parse_and_bind('tab: complete')

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

Nadia Alramli
fuente
Mac OS X usa editline, por lo que hay una funcionalidad de tabulación completa disponible, pero el comando exacto es diferente: readline.parse_and_bind ("bind ^ I rl_complete")
Miles
Eso fue una locura rápida, Nadia, muchas gracias. Probaré ambas respuestas: la plataforma de destino es Ubuntu, por cierto
desmontada el
readline.parse_and_bind('tab: complete')funciona si usas MacPorts Python.
Phillip Cloud
3
Esto debe estar enmarcado. Trabajó en RHEL 6.6. Pyenv, 2.7.10.
BilliAm
¡Por qué no busqué esto todos estos años! Esta solución es excelente, ya que utiliza una herramienta original que es rápida y ligera.
iman
75

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

%history -f /tmp/history.py
Nachouve
fuente
No estaba seguro de la ubicación del archivo usando savemagia. Esto fue muy útil
alpha_989
44
Utilícelo %history -g -f full_history.pypara obtener el historial de todas las sesiones, no solo la actual. Ver también: documentación para% history .
Evgeni Sergeev
19

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

ipython

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

%logstart

Esto creará un archivo .py con un nombre único y almacenará su sesión para su uso posterior como una sesión interactiva de Ipython o para su uso en los scripts que elija.

webappzero
fuente
14

Además, reinteract le brinda una interfaz similar a un cuaderno para una sesión de Python.

Ned Batchelder
fuente
44
reinteractahora es reemplazado por IPython Notebook y QtConsole.
Eric O Lebigot
11

Además de IPython, una utilidad similar bpython tiene la función "guardar el código que ha ingresado en un archivo"

dbr
fuente
3
¿Alguien puede explicar cómo se hace esto con bpython? Intenté ctrl + s pero no funcionó (versión 0.14.2 sobre Python 3.4.3 ejecutando terminal Gnome)
Yibo Yang
Está vinculado a F7 por defecto. F1 le mostrará la ayuda y las combinaciones de teclas actuales.
Jim K.
F7 lanza el editor externo. Ctrl + s debería solicitar una función simple para guardar en el archivo, pero está obligado a "detenerse" en bash y zsh, por lo que deberá elegir una alternativa en la configuración de bpython.
RCross
8

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

Esto funcionará

Si su 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).

Somum
fuente
3

Hay% de magia de historial 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 comandos anteriores con las teclas de flecha hacia arriba y hacia abajo, o acceder a su historial de formas más sofisticadas.

Puede usar la función mágica% history 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,% recordar,% macro,% save y% pastebin. Puede usar un formato estándar para referirse 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% historia? para Docstring y más ejemplos.

Además, asegúrese de explorar las capacidades de % store magic para la persistencia ligera de las 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 -r d  # 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.autorestore = Trueen ipython_config.py.

Alejandro
fuente
La habilitación para guardar el historial de salida se puede hacer habilitando c.HistoryManager.db_log_outputen el archivo de configuración.
Ikke
3

Solo pongo otra sugerencia en el cuenco: Spyder

ingrese la descripción de la imagen aquí

Tiene registro de historia y explorador de variables . Si ha trabajado con MatLab, verá las similitudes.

Norfeldt
fuente
2

En lo que respecta a Linux, uno puede usar el scriptcomando para grabar toda la sesión. Es parte del util-linuxpaquete, por lo que debería estar en la mayoría de los sistemas Linux. Puede crear un alias o función que llame script -c pythony que se guardará en un typescriptarchivo. 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

Una pequeña desventaja aquí es que scriptregistra todo, incluso los saltos de línea, cada vez que pulsa espacios de retroceso, etc. Por lo tanto, puede usar colpara limpiar la salida (consulte esta publicación en Unix & Linux Stackexchange ).

Sergiy Kolodyazhnyy
fuente
2

El %historycomando es impresionante, pero desafortunadamente no le permitirá guardar cosas que fueron% pegadas en el sesh. 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, ny p). Vea los documentos para% history aquí .

palabras por el contrario
fuente
1

Hay otra opción --- pyslice. en el "wxpython 2.8 docs demos and tools", hay un programa de código abierto llamado "pyslices".

puede usarlo como un editor, y también admite el uso como una consola ---- ejecutando 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 registrarán automáticamente en un archivo txt.

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

la visión general de pyslices

fandyst
fuente
PySlices autor aquí. Me alegra que te guste PySlices (y que incluso lo hayas encontrado). Todavía no es del todo abandonado (en realidad todavía lo uso), pero la versión incluida en wxPython a menudo no funciona bien. Si desea seguir las actualizaciones, puede obtenerlas del paquete wx_py : pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
David
1

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

Para guardar los comandos para su posterior reutilización, 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 sitio del entorno global o virtual, directorio actual, mencionando en * .pth, o de alguna otra manera).

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

>>> from mycommands import *
Aidas Bendoraitis
fuente
salvador de vida una respuesta difícil de encontrar
Mehdi LAMRANI
0

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 programació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 -fopción se usa para forzar el reemplazo de archivos y len(IN)-1muestra el indicador de entrada actual en IPython, lo que le permite guardar toda la sesión mediante programación.

EF Haghish
fuente
0

Para aquellos que usan spacemacs, y ipythoneso viene con python-layer, guardar magia crea una gran cantidad de resultados no deseados, debido al comando de autocompletado constante que funciona en segundo plano, como:

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 de ipython como normalmente guarda cualquier otro: spc f s

Kaan E.
fuente
0

Me gustaría sugerir otra forma de mantener la sesión de Python a través de tmux en linux. ejecuta tmux, se adjunta a la sesión que abrió (si no se adjunta después de abrirlo directamente). Ejecute Python y haga lo que esté haciendo en él. luego separarse de la sesión. desconectarse 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 enviar un ssh a 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.

Myonaiz
fuente
0

Para guardar entradas y salidas en XUbuntu :

  1. En XWindows, ejecute iPython desde la aplicación de terminal Xfce
  2. haz clic Terminalen la barra de menú superior y busca save contentsen el menú desplegable

Creo que esto guarda la entrada y la salida, volviendo a cuando abrí el terminal. Esto no es específico de ipython, y funcionaría con sesiones ssh u otras tareas ejecutadas desde la ventana de terminal.

Pablo
fuente