python - 从表兄弟文件夹导入包含代码的 __init__.py?

标签 python python-2.7 import package relative-path

给定目录结构:

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/中的 main() 函数__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

相比之下,当 Python 解释器在/project 中启动时,import ilm.app as app 工作正常。

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

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

相关文章:

python - OSX 上的 Scapy Sniff 段错误

django - 将 CSS 类添加到 django RadioSelect 标签

python - 循环导入 hell

c++ - PyImport_ImportModule 和 import 语句是否加载到不同的命名空间?

python - 为什么 Python 不使用工作目录以及如何修复它?

python - 使用for循环python遍历两个目录

python - 可以一次运行两个无限循环吗?

python用样条曲线关闭两条曲线

python - 多级标签编码器

python - Moodle插件创建