我正在尝试了解__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
答案 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/a
和init_test/b
。