1

我正在使用 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包中a我导入模块

import a1

然后在脚本中我导入我需要的类

from a.a1 import A1

如果 A1 类中有一些错误并且我对其进行了修改,那么在不重新启动内核的情况下无法让 Python 重新加载它。

我试过用del a1, del sys.modules['a1'], del sys.modules['a']. 每次它使用旧版本的类,直到我不重新启动内核......任何人都可以给我一些建议吗?

4

2 回答 2

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

所以它实际上被重新加载了......也是因为如果我在开始时跳过运行自动重新加载命令,它会再次打印“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
于 2017-07-25T12:21:51.203 回答
0

老线程,但我有同样的问题,所以这是我找到的解决方案。您必须使用该模块sys并在导入之前a1编写以下内容sys.modules.pop('a1')

import sys

sys.modules.pop('a1')
import a1

然后重新加载模块。

于 2020-04-08T13:37:49.950 回答