繁体   English   中英

Python 重新加载和 IPython 自动重新加载也不起作用

[英]Python reload, and IPython autoreload as well, is not working

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

这很有趣。 看来我的问题不是由于 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

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

import sys

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

然后重新加载模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM