给定目录结构:
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
中,如果我想导入并执行main()
中的program/ilm/app/__init__.py
函数,实现此目的的有效方法是什么?我问的原因是 script.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
相反,当在/ project中启动Python解释器时,import ilm.app as app
工作正常。
这显然是功能齐全的生产代码,我不应该改变它来运行。
import
语句是否有效,如果是,我缺少什么?sys.path.append()
语句上方的import
添加路径?或者在..
语句中使用import
表示法明确指向程序选择project/ilm/app/__init__.py
?事实是它是__init__.py
我试图导入重要的吗?答案 0 :(得分:2)
两件事。您需要确保iml目录位于python路径中。确保从正确的目录运行python或将正确的路径添加到sys.path列表。而且你需要确保iml和app目录都有
__init__.py
文件,因为python需要将整个事物解释为模块的层次结构而不仅仅是dirs。然后你应该能够做到
from iml import app
答案 1 :(得分:1)
显而易见的结论似乎是iml
目录里面有__init__.py
,但为什么在你的生产设置中会发生这种情况很难说。您是否在生产环境中检查过是否存在这种情况?
假设生产环境 导入iml/app
的包(您可以通过检查app.__file__
进行检查),程序将确实执行main
来自__init__.py
文件的函数 - 但__init__.py
可能很容易从其他地方导入它而不是在本地定义它。
答案 2 :(得分:0)
Python包需要正确的setup.py
which defines the package structure。此外,bin/
脚本应定义为console_scripts entry points。
This all must be installed in a proper Python environment, not just any folder