【问题标题】:Importing a code-containing __init__.py from a cousin folder?从表兄弟文件夹中导入包含代码的 __init__.py?
【发布时间】:2016-04-09 21:15:21
【问题描述】:

给定目录结构:

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/__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 版本:2.7.10
  • 你真的安装 iml了吗?它的目录在你的路径上吗?哪里有setup.py
  • iml 是包中的一个目录(见上面的文件夹结构)
  • 这并没有解决我的任何问题...阅读一下例如docs.python.org/2/tutorial/modules.html
  • iml 不是第三方模块。它是(本项目的)已开发代码库的一部分。

标签: python python-2.7 import packages relative-path


【解决方案1】:

【讨论】:

  • setup.py 用于安装,不影响静态安装的目录。导入时不参考。
【解决方案2】:

显而易见的结论似乎是iml 目录内部有一个__init__.py,但很难说为什么会在您的生产设置中发生这种情况。有没有在生产环境中检查过是否是这种情况?

假设生产环境正在iml/app 处导入包(您可以通过检查app.__file__ 来检查),那么程序确实会执行__init__.py 中的main 函数文件 - 但__init__.py 可能很容易从其他地方导入它,而不是在本地定义它。

【讨论】:

  • 是的,在 iml 文件夹中(在 app 文件夹上方)确实有一个 __init__.py。除了文档字符串之外,它是空的,如果这有任何意义的话。
  • 不,即使是一个空的__init__.py 也足以将目录识别为一个包。但是由于iml 目录与您的程序不在同一个目录中,因此必须将包含它的目录添加到sys.path,我怀疑您会发现这是适合您的生产环境的情况。
【解决方案3】:

两件事。您需要确保 iml 目录位于 python 路径中。确保从正确的目录运行 python 或将正确的路径添加到 sys.path 列表。而且你需要确保 iml 和 app 目录都有

__init__.py

文件,因为 python 需要将整个事情解释为模块的层次结构,而不仅仅是 dirs。那么你应该可以做到

从 iml 导入应用程序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多