首先,如果这个问题已经在其他地方提出过,我道歉。我真的在寻找它,但没有找到任何东西。
情况如下:
在mod
文件夹中,我有__init__.py
和sub.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__
来更改行为吗?这条线似乎很可能对我不利。
答案 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
类型的其他内容。现在我完全糊涂了。