【问题标题】:Python reload, and IPython autoreload as well, is not workingPython 重新加载和 IPython 自动重新加载也不起作用
【发布时间】:2017-07-25 11:00:07
【问题描述】:

我正在使用 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']。每次它使用旧版本的类,直到我不重新启动内核......谁可以给我一些建议?

【问题讨论】:

  • 您可能需要重新阅读 FineManual,然后再声明“重新加载不起作用”?清楚地解释了注意事项和限制:docs.python.org/3/library/imp.html#imp.reload
  • 我发现reload 如果我在 IPython shell 中键入命令可以工作,但如果我通过 Pyzo(我正在使用的 IDE)运行它们就不行。这就是问题所在......

标签: python python-3.x ipython pyzo


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    然后重新加载模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      相关资源
      最近更新 更多