Come salvare una sessione interattiva Python?


416

Mi trovo spesso ad usare l'interprete di Python per lavorare con database, file, ecc., Fondamentalmente molta formattazione manuale di dati semi-strutturati. Non salvo correttamente e ripulisco i bit utili tutte le volte che vorrei. C'è un modo per salvare il mio input nella shell (connessioni db, assegnazioni variabili, poco per loop e bit di logica) - un po 'di storia della sessione interattiva? Se uso qualcosa del genere scriptottengo troppo rumore stdout. Non ho davvero bisogno di decapare tutti gli oggetti, anche se se c'è una soluzione che lo fa, sarebbe OK. Idealmente mi sarebbe rimasto solo uno script che funzionava come quello che ho creato in modo interattivo e potevo semplicemente eliminare i bit che non mi servivano. Esiste un pacchetto che fa questo o un approccio fai-da-te?

AGGIORNAMENTO : Sono davvero sorpreso dalla qualità e dall'utilità di questi pacchetti. Per quelli con un prurito simile:

  • IPython - avrebbe dovuto usarlo da secoli, una specie di cosa avevo in mente
  • reinteragire - molto impressionante, voglio saperne di più sulla visualizzazione e questo sembra che brillerà lì. Ordinamento di un'app desktop gtk / gnome che rende in linea i grafici. Immagina una shell ibrida + calcolatrice grafica + mini eclissi. Distribuzione della fonte qui: http://www.reinteract.org/trac/wiki/GettingIt . Costruito bene su Ubuntu, si integra con desktop gnome, anche con programmi di installazione Windows e Mac.
  • bpython - estremamente interessante, molte funzioni interessanti, completamento automatico (!), riavvolgimento, una sequenza di tasti salva su file, rientro, ben fatto. Distribuzione dei sorgenti Python, ha estratto un paio di dipendenze da sourceforge.

Sono convertito, questi riempiono davvero un bisogno tra interprete ed editore.

Risposte:


411

IPython è estremamente utile se ti piace usare sessioni interattive. Ad esempio per il tuo caso d'uso c'è il %savecomando magico , devi solo inserire %save my_useful_session 10-20 23per salvare le righe di input da 10 a 20 e 23 my_useful_session.py(per aiutarti, ogni riga è preceduta dal suo numero).

Inoltre, la documentazione afferma:

Questa funzione utilizza la stessa sintassi della cronologia% per gli intervalli di input, quindi salva le righe nel nome file specificato.

Ciò consente ad esempio di fare riferimento a sessioni precedenti, ad esempio

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

Guarda i video sulla pagina di presentazione per avere una rapida panoramica delle funzionalità.


11
Come salvare tutte le linee? Senza specificare l'intervallo, crea un file vuoto. :(
balki,

40
@balki, il prompt di IPython ti dice quante linee ci sono nella tua storia (es In[48].). Quindi save filename 1-48salverebbe l'intera sessione.
Ben Page

2
Inoltre, è possibile caricare nuovamente questo file in ipython e mantenere intatta la cronologia di input?
Ben Page

15
@BenPage Usa "ipython -i [nome file]" sul file .py salvato, dal promt bash per caricare nuovamente il file prima di tornare a una console interattiva! (senza il flag -i non si ottiene la console interattiva dopo aver eseguito il file).
Samuel Lampa,

9
@ user4779, come ci si aspetterebbe:%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')

10
Crea un file vuoto per me su Windows 7
ubershmekel

10
Ha funzionato come un incantesimo per me in Ubuntu.
Johndt6,

4
@ubershmekel - Sembra che funzioni solo su Unix
Joel B,

28
Non riesce sulla mia TI-83
Dan

1
Ricordati di farlo alla fine della sessione. Il mio sembrava un po 'vuoto dopo aver chiamato la funzione solo all'inizio.
dolphus333,

95

C'è un modo per farlo. Archivia il file in ~/.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

e quindi imposta la variabile d'ambiente PYTHONSTARTUPnella tua shell (es. in ~/.bashrc):

export PYTHONSTARTUP=$HOME/.pystartup

Puoi anche aggiungere questo per ottenere il completamento automatico gratuitamente:

readline.parse_and_bind('tab: complete')

Nota che funzionerà solo su sistemi * nix. Come readline è disponibile solo nella piattaforma Unix.


Mac OS X utilizza editline, quindi è disponibile la funzionalità di tabulazione completa, ma il comando esatto è diverso: readline.parse_and_bind ("bind ^ I rl_complete")
Miles

È stato follemente veloce, Nadia, molte grazie. Proverò entrambe le risposte - la piattaforma target è Ubuntu, BTW
smontata il

readline.parse_and_bind('tab: complete')funziona se usi MacPorts Python.
Phillip Cloud,

3
Questo dovrebbe essere incorniciato. Ha lavorato su RHEL 6.6. Pyenv, 2.7.10.
Billi,

Perché non ho cercato questo in tutti questi anni! Questa soluzione è eccezionale in quanto utilizza uno strumento originale che è veloce e leggero.
iman,

75

Se stai usando IPython puoi salvare in un file tutti i tuoi comandi precedenti usando la funzione magica % history con il parametro -f , pe:

%history -f /tmp/history.py

Non ero sicuro della posizione del file usando savemagic. Questo è stato molto utile
alpha_989

4
Utilizzare %history -g -f full_history.pyper ottenere la cronologia da tutte le sessioni, non solo quella corrente. Vedi anche: documentazione per% storia .
Evgeni Sergeev,

19

Dopo aver installato Ipython e aver aperto una sessione Ipython eseguendo il comando:

ipython

dalla tua riga di comando, esegui il seguente comando "magico" di Ipython per registrare automaticamente l'intera sessione di Ipython:

%logstart

Ciò creerà un file .py con un nome univoco e memorizzerà la sessione per un uso successivo come sessione Ipython interattiva o per l'uso negli script di tua scelta.



11

Oltre a IPython, un'utilità simile bpython ha una funzione "salva il codice inserito in un file"


3
qualcuno può spiegare come si fa con bpython? Ho provato ctrl + s ma non ha funzionato (versione 0.14.2 sopra Python 3.4.3 con terminale Gnome)
Yibo Yang

È associato a F7 per impostazione predefinita. F1 ti mostrerà l'aiuto e le combinazioni di tasti correnti.
Jim K.

F7 avvia l'editor esterno. Ctrl + s dovrebbe richiedere una semplice funzione di salvataggio su file, ma è destinata a "fermarsi" in bash e zsh, quindi dovrai scegliere un'alternativa nella configurazione di bpython.
RCross,

8

Ho dovuto lottare per trovare una risposta, ero molto nuovo nell'ambiente iPython.

Questo funzionerà

Se la tua sessione iPython è simile a questa

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

Si desidera salvare le righe da 1 a 135, quindi nella stessa sessione ipython utilizzare questo comando

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

Ciò salverà tutte le tue istruzioni python nel file test.py nella tua directory corrente (dove hai avviato ipython).


3

Esiste una% storia magica per la stampa e il salvataggio della cronologia di input (e facoltativamente l'output).

Per memorizzare la sessione corrente in un file denominato my_history.py:

>>> %hist -f my_history.py

Cronologia IPython memorizza sia i comandi immessi sia i risultati che produce. Puoi facilmente passare attraverso i comandi precedenti con i tasti freccia SU e GIÙ o accedere alla cronologia in modi più sofisticati.

È possibile utilizzare la funzione magica% storia per esaminare input e output passati. La cronologia di input delle sessioni precedenti viene salvata in un database e IPython può essere configurato per salvare la cronologia di output.

Diverse altre funzioni magiche possono utilizzare la cronologia di input, tra cui% modifica,% riesegui,% richiamo,% macro,% salvataggio e% pastebin. È possibile utilizzare un formato standard per fare riferimento alle righe:

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

Questo prenderà la linea 3 e le linee da 18 a 20 della sessione corrente e le linee 1-5 dalla sessione precedente.

Vedi% cronologia? per Docstring e altri esempi.

Inoltre, assicurati di esplorare le funzionalità di % store magic per una leggera persistenza delle variabili in IPython.

Memorizza variabili, alias e macro nel database di 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}

Per autorizzare la memorizzazione delle variabili memorizzate all'avvio, specificare c.StoreMagic.autorestore = Truein ipython_config.py.


L'abilitazione del salvataggio della cronologia di output può essere effettuata abilitando c.HistoryManager.db_log_outputnel file di configurazione.
Ikke

3

Metto solo un altro suggerimento nella ciotola: Spyder

inserisci qui la descrizione dell'immagine

Ha registro cronologico ed esploratore di variabili . Se hai lavorato con MatLab, vedrai le somiglianze.


2

Per quanto riguarda Linux, si può usare il scriptcomando per registrare l'intera sessione. Fa parte del util-linuxpacchetto, quindi dovrebbe essere sulla maggior parte dei sistemi Linux. È possibile creare e alias o funzione che chiamerà script -c pythone che verrà salvata in un typescriptfile. Ad esempio, ecco una ristampa di uno di questi file.

$ 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

Il piccolo svantaggio qui è che scriptregistra tutto, anche i feed di linea, ogni volta che si colpisce backspaces, ecc. Quindi potresti voler usare colper ripulire l'output (vedi questo post su Unix e Linux Stackexchange ).


2

Il %historycomando è fantastico, ma sfortunatamente non ti permetterà di salvare cose che sono state% incolla in sesh. Per farlo, penso che tu debba farlo %logstart all'inizio (anche se non ho confermato che funzioni).

Quello che mi piace fare è

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

che salverà l'output, i numeri di riga e '>>>' prima di ogni input (opzioni o, n e p). Consulta i documenti per la cronologia% qui .


1

c'è un'altra opzione --- pyslice. nelle "demo e strumenti di wxpython 2.8 docs", c'è un programma open source chiamato "pyslices".

puoi usarlo come un editor, e supporta anche l'uso come una console ---- eseguendo ogni riga come un interprete interattivo con eco immediato.

ovviamente, tutti i blocchi di codici e risultati di ciascun blocco verranno automaticamente registrati in un file txt.

i risultati vengono registrati proprio dietro il corrispondente blocco di codice. molto conveniente.

la panoramica dei pyslices


L'autore di PySlices qui. Sono contento che ti piaccia PySlices (e che l'hai persino trovato). Non è ancora del tutto un servizio di abbandono (lo uso ancora), ma spesso la versione inclusa in wxPython non funziona bene. Se vuoi seguire gli aggiornamenti puoi ottenerli dal pacchetto wx_py : pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
David

1

Se si utilizza bpython , tutta la cronologia dei comandi viene salvata per impostazione predefinita in ~/.pythonhist.

Per salvare i comandi per un riutilizzo successivo, è possibile copiarli in un file di script Python:

$ cp ~/.pythonhist mycommands.py

Quindi modifica quel file per ripulirlo e inserirlo nel percorso Python (pacchetti del sito dell'ambiente globale o virtuale, directory corrente, menzionando in * .pth o in altro modo).

Per includere i comandi nella shell, è sufficiente importarli dal file salvato:

>>> from mycommands import *

salvatore della vita. una risposta difficile da trovare
Mehdi LAMRANI,

0

Alcuni commenti chiedevano come salvare tutti gli input di IPython contemporaneamente. Per% save magic in IPython, è possibile salvare tutti i comandi a livello di codice come mostrato di seguito, per evitare il messaggio di richiesta e anche per specificare i numeri di input. currentLine = len (In) -1% save -f my_session 1- $ currentLine

L' -fopzione viene utilizzata per forzare la sostituzione dei file e len(IN)-1mostra l'attuale prompt di input in IPython, che consente di salvare l'intera sessione a livello di codice.


0

Per coloro che utilizzano spacemacse ipythonciò viene fornito python-layer, save magic crea un sacco di output indesiderato, a causa del costante comando di completamento automatico che funziona in background come:

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)

Per evitarlo basta salvare il buffer ipython come se normalmente si salvasse qualsiasi altro: spc f s


0

Vorrei suggerire un altro modo per mantenere la sessione Python tramite tmux su Linux. corri tmux, attacca te stesso alla sessione che hai aperto (se non collegato dopo averlo aperto direttamente). esegui Python e fai quello che stai facendo. quindi staccare dalla sessione. il distacco da una sessione di tmux non chiude la sessione. la sessione rimane aperta.

pro di questo metodo: puoi collegarti a questa sessione da qualsiasi altro dispositivo (nel caso in cui puoi ssh il tuo pc)

contro di questo metodo: questo metodo non abbandona le risorse utilizzate dalla sessione di Python aperta fino a quando non esiste effettivamente l'interprete di Python.


0

Per salvare input e output su XUbuntu :

  1. In XWindows, esegui iPython dall'app del terminale Xfce
  2. fai clic Terminalsulla barra dei menu in alto e cerca save contentsnel menu a discesa

Trovo che questo salvi l'input e l'output, risalendo a quando ho aperto il terminale. Questo non è specifico di IPython e funzionerebbe con sessioni ssh o altre attività eseguite dalla finestra del terminale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.