子模块导入主模块

5 投票
3 回答
1441 浏览
提问于 2025-04-17 02:46

首先,如果这个问题已经在其他地方被问过,我在这里表示歉意。我真的搜索过,但没有找到相关内容。

情况是这样的:

在一个名为 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

为了完整性,我在玩相对导入的时候找到了另一个解决方案:

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

撰写回答