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

时间:2016-01-05 21:59:02

标签: python python-2.7 import packages 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中,如果我想导入并执行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工作正常。

这显然是功能齐全的生产代码,我不应该改变它来运行。

  1. 鉴于目录结构,import语句是否有效,如果是,我缺少什么?
  2. 如果没有,推荐的导入方式是什么?使用sys.path.append()语句上方的import添加路径?或者在..语句中使用import表示法明确指向程序选择project/ilm/app/__init__.py?事实是它是__init__.py我试图导入重要的吗?

3 个答案:

答案 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)