2015-05-05 12 views
5

Sono un principiante di Python e Ipython. Questa potrebbe essere una domanda banale. Probabilmente è stato duplicato con altre domande. Tuttavia non so quali parole chiave dovrei cercare.come memorizzare l'output magico di ipython nella variabile

Ho già saputo come interagire con la shell.

Ad esempio:

In [1]: a = !ls 
In [2]: a 
     ...same ls result as shell... 
In [3]: type(a) 
Out[3]: IPython.utils.text.SList 

Tuttavia, come interattiva con la magia ipython?

Per esempio

In [1]: a = %history -t 
     ...Ipython result... 
In [2]: a 
In [3]: type(a) 
Out[3]: NoneType 
+0

? Storia ti indica dove è definito. import IPython.core.magics.history.HistoryMagics ti consente di chiamarlo. xxx = IPython.core.magics.history.HistoryMagics() e xxx.history() danno un errore. Quindi sono rimasto bloccato. –

risposta

1

Per il comando della storia, in particolare, la soluzione più semplice è

In [243]: history -t -f history.txt 
In [244]: with open('history.txt') as f: 
    .....:  HIST = [l.strip() for l in f] 
    .....:  

In [245]: len(HIST) 
Out[245]: 258 

In [246]: HIST[-1] 
Out[246]: "get_ipython().magic(u'history -t -f history.txt')" 

In [247]: 

In sostanza, il dump in un file e leggere nuovamente.

Questo può sembrare un kludge, ma ho il sospetto che provenga dalla natura di IPython. In realtà non è un interprete, ma è invece una shell della riga di comando per l'interprete sottostante. Il mio sospetto è che i comandi magici siano gestiti all'interno di IPython e non passino attraverso il normale percorso di trasmissione del comando all'interprete, catturando l'output e memorizzandolo nella cronologia dei comandi come Out [n]. Quindi non è disponibile per il richiamo e l'assegnazione.

L'alternativa è che get_ipython().magic restituisce semplicemente None.

In entrambi i casi, l'uscita schermo d = per %history non è disponibile. Devi scaricarlo su un file.

Sembra variare per comando magico. alias, ad esempio, restituisce l'output dello schermo

In [288]: a=%alias 
Total number of aliases: 17 

In [289]: a 
Out[289]: 
[('cat', 'cat'), 
('clear', 'clear'), 
('cp', 'cp'), 
('ldir', 'ls -F -G -l %l | grep /$'), 
('less', 'less'), 
('lf', 'ls -F -l -G %l | grep ^-'), 
('lk', 'ls -F -l -G %l | grep ^l'), 
('ll', 'ls -F -l -G'), 
('ls', 'ls -F -G'), 
('lx', 'ls -F -l -G %l | grep ^-..x'), 
('man', 'man'), 
('mkdir', 'mkdir'), 
('more', 'more'), 
('mv', 'mv'), 
('rm', 'rm'), 
('rmdir', 'rmdir'), 
(u'show', u'echo')] 

In [290]: 
+0

Beh, penso che il risultato di dump magic in file possa essere una soluzione (posso scrivere il codice in un modulo personalizzato per il riutilizzo.) Comunque voglio sapere se c'è un modo semplice per farlo non per una magia specifica? (In caso contrario, perché Ipython non fornisce questa soluzione?) –

+0

"i comandi magici vengono gestiti all'interno di IPython". Ok, sembra una possibile ragione. A proposito, penso che "quei comandi alias" non siano collegati con la magia di Ipython escludendo "% alias stesso". (Quelli sono basati su comandi di shell non magici) Ad ogni modo, metterò questa domanda per un po ', continuo a ringraziare per la tua spiegazione. –

+0

Concordato che 'alias' si riferisce ai comandi della shell .. ma è anche un esempio di un comando'% magic' che restituisce il suo output. Non penso che troverai una soluzione unica per tutti loro. – kdopen