子模块导入主模块

Tur*_*ion 5 python import module

首先,如果在其他地方已经提出过这个问题,我很抱歉.我真的在寻找它,但没有找到任何东西.

情况如下:在文件夹中mod,我有文件__init__.pysub.py.它们包含以下数据 __init__.py:

print "mod"
Run Code Online (Sandbox Code Playgroud)

sub.py:

import __init__
print "sub"
Run Code Online (Sandbox Code Playgroud)

现在让我们做以下事情:

>>> import mod
mod
>>> import mod.sub
mod
sub
Run Code Online (Sandbox Code Playgroud)

但是在做的时候import mod.sub,为什么mod/__init__.py再次执行?它已经被导入了.如果我们只是调用,则存在同样的奇怪特征:

>>> import mod.sub
mod
mod
sub
Run Code Online (Sandbox Code Playgroud)

我可以通过更改import __init__?来改变行为吗?这条线似乎很可能对我不利.

Oli*_*ier 7

您实际上可以通过使用字典来检查发生了什么sys.modules.Python决定根据该字典中的键重新加载模块.

当您运行import mod,它会创建一个条目,modsys.modules.

当你运行时import mod.sub,在调用之后import __init__,Python检查密钥mod.__init__是否在sys.modules,但是没有这样的密钥,所以它再次被导入.

底线是Python决定通过存在的键重新导入模块sys.modules,而不是因为实际模块已经导入.