Python 重新加载本地模块是';行不通
首先,我知道这之前已经发布过,但是A)建议不起作用,或者B)建议从名称空间手动删除模块,然后像正常情况一样重新导入 我有以下模块结构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: >&
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”
,所以请提问并显示它的内容,也