2012-10-31 33 views
18

當模塊我愛IPython的,但我已經發現了%運行的一個問題:導入模塊時運行%重複調用,不會重新加載。IPython的:重新導入使用%運行

假設文件ex1.py包含行:

import ex2 
ex2.x.append(1) 
print ex2.x 

和文件ex2.py包含:

x = [] 

現在,從命令行運行蟒ex1.py反覆打印[1]每次。但是,從內調用%run ex1.py IPython的反覆打印[1],[1,1],[1,1,1],等等,這是因爲模塊ex2.py不重新加載。所以我們有一個問題:ipython運行腳本協議並不反映「真實世界」的行爲。

注:

%load_ext autoreload 
%autoreload 2 

幫助。這些行會是否改變已到ex2.py文件所做的得到ex2.py只有重新加載。如果我們沒有做出任何改變,或者只是對ex1.py進行修改,我們會得到不希望的行爲。

有沒有什麼辦法讓跑%表現喜歡這裏的命令行?使用ipython作爲腳本的測試環境似乎是一個真正的缺陷。 (或者道義上,一個模塊不應該寫入另一個模塊的名稱空間?)

回答

11

%run ex1.py(或任何有關此事的腳本)即使將autoreload擴展設置爲2,也不會深入重新導入導入的模塊它是一個「缺陷」有怎樣的IPython的%run命令作品。

您必須顯式調用

dreload(ex2) 

的深重載再次執行%run ex1.py之前。

見 - http://ipython.org/ipython-doc/dev/api/generated/IPython.lib.deepreload.html

有可能是計劃使%run做深重裝以後自動,你可以找到這個問題,這仍然是在這個時候寫的一個懸而未決的問題,正由用戶建議在這裏 - https://github.com/ipython/ipython/issues/461

6

我遇到了同樣的問題。在我看來,這是ipython的運行命令的不良影響 - 它不會重新加載導入的模塊。

作者是正確的:如果已經作了修改,以ex2.py,以下命令將有助於重新加載

%load_ext autoreload 
%autoreload 2 

我來解決簡單的方法是修改導入的模塊(在這個例子中,ex2.py),並在ipython中執行以下命令:

%load_ext autoreload 
%autoreload 2 
%run ex1.py 

這有助於重新加載ex2.py。

請注意,在執行上述3行之前,必須每次修改ex2.py。只有這樣,模塊ex2才能被重新加載。