我正在尝试了解该__init__.py文件如何用于打包和调用来自不同目录的模块.
我有这样的目录结构:
init_test\
__init__.py
a\
aaa.py
b\
bbb.py
Run Code Online (Sandbox Code Playgroud)
在aaa.py那里有一个叫做的函数test
bbb.py 看起来像这样:
import init_test.a.aaa
if __name__ == "__main__":
init_test.a.aaa.test()
Run Code Online (Sandbox Code Playgroud)
但这给了我 ImportError: No module named a.aaa
我究竟做错了什么?我试过从包结构上面的模块做相同的基本事情,而不是在包内,这也不起作用?我的__init__.py
您还需要在a和b目录中包含__init__.py
要使您的示例首先工作,您应该将基本目录添加到路径:
import sys
sys.path.append('../..')
import init_test.a.aaa
...
Run Code Online (Sandbox Code Playgroud)
你必须__init__.py在a中添加一个空。那么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()
Run Code Online (Sandbox Code Playgroud)
然后你就可以开始了
python init_test/b/bbb.y
Run Code Online (Sandbox Code Playgroud)
或者如果你在b/里面
python bbb.py
Run Code Online (Sandbox Code Playgroud)