子模块导入主模块
首先,如果这个问题已经在其他地方被问过,我在这里表示歉意。我真的搜索过,但没有找到相关内容。
情况是这样的:
在一个名为 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__
的方式来改变这种行为吗?我觉得这一行最有可能是错的。
3 个回答
0
为了完整性,我在玩相对导入的时候找到了另一个解决方案:
把
import __init__
换成
from . import __init__
但是我不明白为什么这样做有效。
编辑:其实这并不奏效。结果得到的__init__
并不是模块mod
,而是其他类型的method-wrapper
。现在我完全搞糊涂了。
7
其实你可以通过查看一个叫做 sys.modules
的字典来了解发生了什么。Python 会根据这个字典里的内容来决定是否重新加载一个模块。
当你运行 import mod
时,它会在 sys.modules
里创建一个条目,名字就是 mod
。
接着,当你运行 import mod.sub
时,Python 会先调用 import __init__
,然后检查 sys.modules
里有没有 mod.__init__
这个键。如果没有这个键,Python 就会再次导入它。
简单来说,Python 是通过 sys.modules
里的键来决定是否重新导入一个模块,而不是因为这个模块之前已经被导入过。
1
你应该把
import __init__
替换成
import mod