如何使用 __init__.py?

6 投票
3 回答
5298 浏览
提问于 2025-04-17 02:08

我正在学习 __init__.py 文件是如何在打包和从不同目录调用模块时工作的。

我的目录结构是这样的:

init_test\
__init__.py
     a\
        aaa.py
     b\
        bbb.py

aaa.py 文件里,有一个叫 test 的函数。

bbb.py 文件看起来是这样的:

import init_test.a.aaa
if __name__ == "__main__":
    init_test.a.aaa.test()

但是这样做让我遇到了 ImportError: No module named a.aaa 的错误。

我哪里做错了?我尝试过从包结构上方的模块做同样的事情,但那也不行?我的 __init__.py 文件

3 个回答

0

__init__.py 文件需要放在你想用作模块的所有文件夹里。在你的例子中,这就意味着 init_test/ainit_test/b 这两个文件夹也需要有这个文件。

7

你还需要在 a 和 b 这两个文件夹里放一个叫 __init__.py 的文件。

为了让你的例子能正常运行,首先你需要把你的基础目录添加到路径中:

import sys
sys.path.append('../..')

import init_test.a.aaa
...
2

你需要在文件夹 a 里添加一个空的 __init__.py 文件。这样,a 就会被认作是 init_test 的一个子包,可以被导入。具体可以参考这个链接:http://docs.python.org/tutorial/modules.html#packages

接着,把 import init_test.a.aaa 改成 import ..a.aaa,这样就应该能正常工作了。正如 Achim 所说,这是一种相对导入,详细信息可以查看这个链接:http://docs.python.org/whatsnew/2.5.html#pep-328

如果你真的想运行 bbb.py,你需要把 init_test/ 加入到你的 Python 路径中,比如:

import sys
import os

dirname = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(dirname, "../.."))

import sys
sys.path.insert(0, ".")
import init_test.a.aaa
if __name__ == "__main__":
    inittest.a.aaa.test()

然后你就可以开始了

python init_test/b/bbb.y

或者如果你在 b/ 文件夹里

python bbb.py

撰写回答