导入此软件包时出现明显的周期性导入错误:
档案__init__.py
:
from . import modules
档案forward.py
:
from .modules import ext_modules
def forward(dest):
if dest in ext_modules:
print("forwarding to {}".format(ext_modules[dest]))
档案modules.py
:
from . import forward
ext_modules = {}
def main():
ext_modules['test'] = 'TEST'
forward.forward('test')
这个导入问题可以解决,例如通过在modules.py文件中交换第1行和第3行。到目前为止,我想我明白发生了什么。
我真的不明白这是什么。当我将另一个导入添加到__init__.py
文件的顶部时:
from . import forward
from . import modules
问题消失了。可以导入包,主函数可以使用。但是,modules
和forward
之间的周期依赖性仍然存在。这些文件未经修改。你能解释一下那里发生了什么吗? (Python版本3.5)
答案 0 :(得分:1)
导入模块时首先发生的事情是将空 module
对象添加到sys.modules
映射中。该模块的后续import
语句将重用该对象,而不是将该文件加载到内存中。
module
对象。
在您的情况下,重要的是导入模块的 order 。 forward
直接取决于modules
的模块内容,而modules
仅取决于存在的模块forward
,而不是该模块的内容(forward.forward
引用依赖项被推迟到调用main()
之后。
因此,如果先导入forward
,则会创建空的forward
module
对象,执行第一行from .modules import ext_modules
,触发modules.py
文件要加载,然后安全地使用from . import forward
,因为现在存在空 module
对象。然后modules.py
文件的其余部分可以继续运行而不会发生其他事件。
但是如果您先导入modules
,那么还没有forward
module
个对象,那么forward.py
文件将在第二个位置运行,{{1} }行失败,因为from .modules import ext_modules
modules
对象仍为空且没有module
属性。