给定目录结构:
program/
setup.py
ilm/
__init__.py
app/
__init__.py
bin/
script.py
注意:setup.py 不是典型的 setup.py,而是专门为 py2app 定制的设置。
program/ilm/app/__init__.py
是非空的:它包含一个 main()
函数,该函数在同一文件中实例化一个类。我的问题:在 program/ilm/bin/script.py
中,如果我想导入并执行 program/ilm/app/中的
,实现此目的的有效方法是什么?我问的原因是 script.py 正在这样做:main()
函数__init__.py
import ilm.app as app
if __name__ == '__main__':
app.main()
根据我对打包和导入的理解(诚然有限),这不应该起作用,因为我们没有明确告诉 script.py 在哪里寻找 project/ilm/app/__init__.py
使用 ..
。事实上,我得到:
MacBook-Pro-de-Pyderman:program Pyderman$ python ./bin/script.py
Traceback (most recent call last):
File "./bin/script.py", line 5, in <module>
import ilm.app as app
ImportError: No module named ilm.app
相比之下,当 Python 解释器在/project 中启动时,import ilm.app as app
工作正常。
这显然是功能齐全的生产代码,我不必更改它即可运行。
- 给定目录结构,
import
语句是否有效?如果有效,我缺少什么? - 如果没有,建议的导入方式是什么?在
import
语句上方使用sys.path.append()
添加路径?或者在import
语句中使用..
表示法显式指向程序来获取project/ilm/app/__init__.py
?我试图导入的__init__.py
事实是否重要?
最佳答案
有两件事。您需要确保 iml 目录位于 python 路径中。确保从正确的目录运行 python 或将正确的路径添加到 sys.path 列表中。并且您需要确保 iml 和 app 目录都有
__init__.py
文件,因为Python需要将整个事物解释为模块的层次结构而不仅仅是目录。那么你应该能够做到
from iml import app
关于python - 从表兄弟文件夹导入包含代码的 __init__.py?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34621983/