从堂兄文件夹中导入包含代码的 __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 工作正常。

这显然是功能齐全的生产代码,我不必更改它就可以获得 运行。

  1. 给定目录结构,import 语句是否有效?如果是,我缺少什么?
  2. 如果没有,推荐的导入方法是什么?在 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