你如何使用__init__.py?

时间:2011-09-12 18:42:08

标签: python module

我正在尝试了解__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 :(得分:7)

您还需要在a和b目录中拥有__init__.py

要使您的示例首先工作,您应该将基目录添加到路径:

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

import init_test.a.aaa
...

答案 1 :(得分:2)

您必须将空__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

答案 2 :(得分:0)

__init__.py需要位于您要用作模块的所有文件夹中。在您的情况下,这也意味着init_test/ainit_test/b