Python重新加载,以及IPython自动重载也无法正常工作

时间:2017-07-25 11:00:08

标签: python python-3.x ipython pyzo

我正在使用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 a1del sys.modules['a1']。每次它使用旧版本的类,直到我不重新启动内核...任何人都可以给我一些建议吗?

2 个答案:

答案 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

然后重新加载模块。