Python 重新加载本地模块是';行不通

Python 重新加载本地模块是';行不通,python,python-3.x,ipython,python-importlib,Python,Python 3.x,Ipython,Python Importlib,首先,我知道这之前已经发布过,但是A)建议不起作用,或者B)建议从名称空间手动删除模块,然后像正常情况一样重新导入 我有以下模块结构 basedir/ pytools/ __init__.py tools.py setup.py test.py 如果我在basedir中,导入pytools并创建类testcls的对象。类的实际属性可在tools.py中找到testcls有一个名为testfunc的方法,它只需立即打印出AAA: >&

首先,我知道这之前已经发布过,但是A)建议不起作用,或者B)建议从名称空间手动删除模块,然后像正常情况一样重新导入

我有以下模块结构

basedir/
    pytools/
        __init__.py
        tools.py
    setup.py
    test.py
如果我在
basedir
中,导入
pytools
并创建类
testcls
的对象。类的实际属性可在
tools.py
中找到
testcls
有一个名为
testfunc
的方法,它只需立即打印出
AAA

>>> import pytools
>>> test = pytools.testcls()
>>> test.testfunc()
AAA
假设我将
testfunc()
更改为现在打印出
BBB
。我这样做,并保存文件。然后我重新加载模块并重试,它不会打印出
BBB

>>> from importlib import reload
>>> reload(pytools)
>>> test = pytools.testcls()
>>> test.testfunc()
AAA
但是如果我执行完全相同的过程,但改为更改
test.py
,将该文件作为模块导入,编辑其中的函数,然后重新加载,则其行为与预期一致:

>>> import test
>>> testvariable = test.testcls()
>>> testvariable.testfunc2()
AAA
# Change the function here
>>> from importlib import reload
>>> reload(test)
>>> testvariable = test.testcls()
>>> testvariable.testfunc2()
BBB
我真的不明白发生了什么,这真的让我很恼火。这也花了我不少时间,但我现在更生气了

知道发生了什么吗

版本: Python:3.6.5


解释器:Ipyton,6.2.1

basedir/
    testpackage/
        __init__.py
        testmodule.py
    test.py
如果testmodule.py包含:

class TestClass:
    def test_method(self):
        print("AAA")
然后,以下操作将按照您的预期工作:

>>> from testpackage import testmodule
>>> obj = testmodule.TestClass()
>>> obj.test_method()
DDD
>>> # === Edit ===
>>> from importlib import reload
>>> reload(testmodule)
>>> obj = testmodule.TestClass()
>>> obj.test_method()
EEE
>>> import testpackage
>>> obj = testpackage.TestClass()
>>> obj.test_method()
HHH
>>> # === Edit ===
>>> from importlib import reload
>>> reload(testpackage.testmodule)
>>> reload(testpackage)
>>> obj = testpackage.TestClass()
>>> obj.test_method()
III
但是,如果
\uuuu init\uuuuu.py
有如下内容:

from .testmodule import TestClass
如果您尝试导入(并重新加载)包而不是模块,则会发生以下情况:

>>> import testpackage
>>> obj = testpackage.TestClass()
>>> obj.test_method()
EEE
>>> # === Edit ===
>>> from importlib import reload
>>> reload(testpackage)
>>> obj = testpackage.TestClass()
>>> obj.test_method()
EEE
(不变)

请注意以下部分:

如果一个模块使用from…import…从另一个模块导入对象,则为另一个模块调用reload()不会重新定义从该模块导入的对象-一种方法是重新执行from语句,另一种方法是使用import和限定名(module.name)

如果您要同时重新加载模块和包,那么按照该顺序,它将再次按照您的预期工作:

>>> from testpackage import testmodule
>>> obj = testmodule.TestClass()
>>> obj.test_method()
DDD
>>> # === Edit ===
>>> from importlib import reload
>>> reload(testmodule)
>>> obj = testmodule.TestClass()
>>> obj.test_method()
EEE
>>> import testpackage
>>> obj = testpackage.TestClass()
>>> obj.test_method()
HHH
>>> # === Edit ===
>>> from importlib import reload
>>> reload(testpackage.testmodule)
>>> reload(testpackage)
>>> obj = testpackage.TestClass()
>>> obj.test_method()
III
但这似乎很愚蠢且容易出错,只需使用第一个示例中的方法:

from testpackage import testmodule
...
reload(testmodule)
... 

嗯,我不确定我能帮上什么忙,但是当您重新加载时,
test
变量(
test=pytools.testcls()
)是否仍在命名空间中?在这种情况下,这可能会影响重新加载。也许可以尝试删除
测试
,然后重新加载?抱歉,如果它最终没有帮助-我是凭直觉而不是凭经验来写的。
\uuuu init\uuuuuuuuuuuuuupy
的内容是什么?你必须在
\uuuu init\uuuuuuuuuuuuuuuuuuuupy
中有一些东西,否则你会得到一个
属性错误:模块“pytools”没有属性“testcls”
,所以请提问并显示它的内容,也