我正在使用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
,我想从其中一个脚本调用它。在__init__.p
包[{1}}中,我导入了模块
a
然后在脚本中导入我需要的类
import a1
如果A1类中有一些错误并且我修改了它,那么没有重新启动内核就无法让Python重新加载它。
我尝试使用from a.a1 import A1
,del a1
,del sys.modules['a1']
。每次它使用旧版本的类,直到我不重新启动内核...任何人都可以给我一些建议吗?
答案 0 :(得分:0)
这很有趣。似乎我的问题不是由于IPython而是由于Pyzo(我使用的IDE)。我向a1添加了一个TestClass:
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
答案 1 :(得分:0)
旧线程,但是我遇到了同样的问题,因此这是我找到的解决方案。您必须使用模块sys
,并在导入a1
之前编写以下sys.modules.pop('a1')
:
import sys
sys.modules.pop('a1')
import a1
然后重新加载模块。