子模块导入主模块

时间:2011-09-21 17:05:31

标签: python import module

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

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

print "mod"

sub.py

import __init__
print "sub"

现在让我们执行以下操作:

>>> import mod
mod
>>> import mod.sub
mod
sub

但在执行import mod.sub时,为什么mod/__init__.py会再次执行?它已经被导入了。 如果我们只是调用相同的奇怪功能:

>>> import mod.sub
mod
mod
sub

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

3 个答案:

答案 0 :(得分:7)

您可以使用字典sys.modules实际检查正在发生的事情。 Python决定根据该字典中的键重新加载模块。

当您运行import mod时,它会在mod中创建一个条目sys.modules

当您运行import mod.sub时,在调用import __init__之后,Python会检查密钥mod.__init__是否在sys.modules中,但是没有这样的密钥,所以它是再次进口。

底线是Python决定按sys.modules中的键重新导入模块,而不是因为实际模块已经导入。

答案 1 :(得分:1)

你应该替换

import __init__

通过

import mod

答案 2 :(得分:0)

为了完整起见,我找到了另一个解决相关导入的解决方案:

替换

import __init__

通过

from . import __init__

但我不明白为什么会这样。

编辑:这实际上不起作用。生成的__init__不是模块mod,而是method-wrapper类型的其他内容。现在我完全糊涂了。