2015-05-05 47 views
5

我是一名python和Ipython初學者。這可能是一個微不足道的問題。它可能與其他問題重複。但是我不知道我應該搜索什麼關鍵詞。如何將ipython魔術輸出存儲到變量中

我已經知道如何與shell交互。

例如:

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

但是,如何互動與IPython的魔力?

例如

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

?歷史記錄會給你它定義的位置。導入IPython.core.magics.history.HistoryMagics將讓你打電話給它。 xxx = IPython.core.magics.history.HistoryMagics()和xxx.history()會報錯。然後我卡住了。 –

回答

1

對於歷史命令,具體而言,最簡單的解決方案是

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]: 

基本上,它轉儲到一個文件,並讀回。

這可能看起來很混亂,但我懷疑它來自IPython的本質。它實際上不是解釋器,而是底層解釋器的命令行shell。我懷疑魔術命令是在IPython內部處理的,並沒有經過將命令傳遞給解釋器的正常路徑,捕獲輸出並將其作爲Out [n]存儲在命令歷史記錄中。因此它不適用於召回和分配。

另一種方法是get_ipython().magic只是返回None

無論哪種方式,屏幕輸出d = for %history不可用。你必須將其轉儲到一個文件。

它似乎每魔術指令變化。例如,alias確實返回屏幕輸出

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

嗯,我認爲將魔法結果轉儲到文件中可能是一個解決方案(我可以將代碼寫入自定義模塊中以供重複使用。)但是,我想知道是否有一種簡單的方法可以做到這一點,而不是針對任何特定的魔法? (如果沒有,爲什麼Ipython不提供這個解決方案?) –

+0

'魔術命令在IPython內處理'。好的,這似乎是一個可能的原因。順便說一句,我認爲'這些別名命令'與Ipython魔術不相關,不包括'%別名本身'。 (那些基於shell的命令不是魔術)無論如何,我會把這個問題放一會兒,我仍然感謝你的解釋。 –

+0

同意'別名'涉及shell命令..但它也是'%magic'命令的一個例子,它返回它的輸出。我不認爲你會找到所有這些解決方案。 – kdopen

相關問題