如何使用 __init__.py?
我正在学习 __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/a
和 init_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