2017-07-25 68 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