从堂兄文件夹中导入包含代码的 __init__.py?
Importing a code-containing __init__.py from a cousin folder?
给定目录结构:
program/
setup.py
ilm/
__init__.py
app/
__init__.py
bin/
script.py
注意:setup.py 不是典型的 setup.py,而是专门为 py2app 定制的设置。
program/ilm/app/__init__.py
是非空的:它包含一个 main()
函数,它在同一个文件中实例化一个 class。我的问题:在 program/ilm/bin/script.py
中,如果我想在 program/ilm/app/__init__.py
中导入并执行 main()
函数,实现此目的的有效方法是什么?我问的原因是 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
相比之下,当 Python 解释器在 /project 中启动时,import ilm.app as app
工作正常。
这显然是功能齐全的生产代码,我不必更改它就可以获得 运行。
- 给定目录结构,
import
语句是否有效?如果是,我缺少什么?
- 如果没有,推荐的导入方法是什么?在
import
语句上方使用 sys.path.append()
添加路径?还是在import
语句中使用..
表示法明确指向程序去取project/ilm/app/__init__.py
?这是一个 __init__.py
我正在尝试导入的事实吗?
Python 包需要适当的 setup.py
which defines the package structure. Furthermore bin/
scripts should be defined as console_scripts entry points.
This all must be installed in a proper Python environment, not just any folder.
显而易见的结论似乎是 iml
目录中有一个 __init__.py
,但很难说为什么会在您的生产设置中发生这种情况。生产环境有没有检查过是不是这样?
假设生产环境是导入包在iml/app
(你可以通过检查app.__file__
来检查)那么程序确实会执行__init__.py
文件中的 main
函数 - 但 __init__.py
可能很容易从其他地方导入它,而不是在本地定义它。
两件事。您需要确保 iml 目录位于 python 路径中。要么确保您 运行 python 来自正确的目录,要么将正确的路径添加到 sys.path 列表。并且您需要确保 iml 和 app 目录都具有
__init__.py
文件,因为 python 需要将整个文件解释为模块的层次结构,而不仅仅是目录。那么你应该可以做到
from iml import app
给定目录结构:
program/
setup.py
ilm/
__init__.py
app/
__init__.py
bin/
script.py
注意:setup.py 不是典型的 setup.py,而是专门为 py2app 定制的设置。
program/ilm/app/__init__.py
是非空的:它包含一个 main()
函数,它在同一个文件中实例化一个 class。我的问题:在 program/ilm/bin/script.py
中,如果我想在 program/ilm/app/__init__.py
中导入并执行 main()
函数,实现此目的的有效方法是什么?我问的原因是 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
相比之下,当 Python 解释器在 /project 中启动时,import ilm.app as app
工作正常。
这显然是功能齐全的生产代码,我不必更改它就可以获得 运行。
- 给定目录结构,
import
语句是否有效?如果是,我缺少什么? - 如果没有,推荐的导入方法是什么?在
import
语句上方使用sys.path.append()
添加路径?还是在import
语句中使用..
表示法明确指向程序去取project/ilm/app/__init__.py
?这是一个__init__.py
我正在尝试导入的事实吗?
Python 包需要适当的 setup.py
which defines the package structure. Furthermore bin/
scripts should be defined as console_scripts entry points.
This all must be installed in a proper Python environment, not just any folder.
显而易见的结论似乎是 iml
目录中有一个 __init__.py
,但很难说为什么会在您的生产设置中发生这种情况。生产环境有没有检查过是不是这样?
假设生产环境是导入包在iml/app
(你可以通过检查app.__file__
来检查)那么程序确实会执行__init__.py
文件中的 main
函数 - 但 __init__.py
可能很容易从其他地方导入它,而不是在本地定义它。
两件事。您需要确保 iml 目录位于 python 路径中。要么确保您 运行 python 来自正确的目录,要么将正确的路径添加到 sys.path 列表。并且您需要确保 iml 和 app 目录都具有
__init__.py
文件,因为 python 需要将整个文件解释为模块的层次结构,而不仅仅是目录。那么你应该可以做到
from iml import app