你如何使用__init__.py?

Col*_*ips 6 python module

我正在尝试了解该__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

cen*_*zen 7

您还需要在a和b目录中包含__init__.py

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

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

import init_test.a.aaa
...
Run Code Online (Sandbox Code Playgroud)


roc*_*ker 2

你必须__init__.py在a中添加一个空。那么a就被识别为init_test的子包,可以导入了。请参阅http://docs.python.org/tutorial/modules.html#packages

然后更改import init_test.a.aaaimport ..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)