2017-07-25 71 views
0

我正在使用Python + IPython進行數據科學。我做了一個包含所有我寫的模塊,在程序包中的文件夾,像Python重載和IPython自動重載也不起作用

python_workfolder 
| 
|---a 
| |---__init__.py 
| |---a1.py 
| |---a2.py 
| 
|---b 
| |---__init__.py 
| |---b1.py 
| |---b2.py 
| 
|---c 
| |---__init__.py 
| |---c1.py 
| |---c2.py 
| 
| 
|---script1.py 
|---script2.py 

在每次會議開始時我問到的IPython自動重載模塊:

%load_ext autoreload 
%autoreload 2 

現在...讓我們說a1.py包含一個類,A1,我想從其中一個腳本調用。在包a__init__.p我導入模塊

import a1 

然後在腳本中,我導入類,我需要

from a.a1 import A1 

如果在A1類的一些錯誤,我修改它,也沒有讓Python重新加載它而不重新啓動內核的方式。

我試過del a1del sys.modules['a1'],del sys.modules['a']。每次它使用舊版本的類,直到我沒有重新啓動內核...任何人都可以給我一些建議?

+0

您可能要指出,「重裝不起作用」,然後再重新閱讀FineManual?這些注意事項和限制都有明確的解釋:https://docs.python.org/3/library/imp.html#imp.reload –

+0

我發現如果我在IPython shell中鍵入命令,'reload'可以工作,但它確實不是如果我通過Pyzo(我正在使用的IDE)運行它們。這是問題... – Marco

回答

0

這很有趣。看來我的問題不是由IPython引起的,而是由Pyzo引起的(我使用的IDE)。我添加了一個識別TestClass至A1:

class TestClass: 
    def __init__(self): 
     pass 
    def disp(self): 
     print('AAA') 

這是輸出我從一個IPython的shell中運行命令得到:

In [2]: from a.a1 import TestClass 
In [3]: t=TestClass() 
In [4]: t.disp() 
AAA 

現在我修改disp打印 'BBB'

In [5]: t.disp() 
BBB 

所以它實際上是重新加載...也因爲如果我在開始時跳過運行autoreload命令,它再次打印'AAA'。所以它的工作。

相反,如果我通過Pyzo運行命令(創建腳本,選擇行並按F9或右鍵單擊編輯器選項卡並選擇'運行文件')它不會重新加載!

In [2]: (executing lines 1 to 3 of "testscript.py") 
AAA 

我再次修改disp打印「BBB」

In [3]: (executing lines 1 to 3 of "testscript.py") 
AAA