【问题标题】:Import error despite __init__.py exists in the folder that contains the target module尽管包含目标模块的文件夹中存在 __init__.py,但导入错误
【发布时间】:2014-10-14 20:14:07
【问题描述】:

我在virtualenv 中有以下目录结构:

/dir_a/dir_b/__init__.py
/dir_a/dir_b/module_1.py
/dir_a/dir_b/module_2.py
/dir_a/dir_c/__init__.py
/dir_a/dir_c/module_3.py
/dir_a/__init__.py
/dir_a/module_4.py

module_4.py里面,我可以成功导入module_1.pymodule_2.pymodule_3.py。另一方面,我无法在module_3.py 中导入module_4.py(例如import dir_a.module_4)。它抱怨:“没有名为 dir_a.module_4 的模块”

我在这里缺少什么?我需要在这里弄乱我的virtualenv 的 PYTHONPATH 吗?如果是这样,为什么 module_1.pymodule_2.pymodule_3.py 的导入都可以在不触及 PYTHONPATH 的情况下进行?

【问题讨论】:

  • 这里的一个附带问题是拥有子项目dir_bdir_c 应该意味着它们可能相互依赖,但绝不会依赖于自身之上的任何东西。

标签: python python-2.7 python-import pythonpath


【解决方案1】:

在这种情况下,我不会与PYTHONPATH 混淆。我认为您需要的是Intra-package References。在您的特定情况下,要从 module_3 这样的子模块导入 module_4,您需要:

from .. import module_4

我将尝试重新创建一个人为的例子来解释我自己:

module_1.py:

# import sibling submodule
print 'module_1'
from . import module_2

module_2.py:

print 'module_2'

module_3.py:

# import parent module
print 'module_3'
from .. import module_4

module_4.py:

# import child submodule
print 'module_4'
import dir_b.module_1

还有一个额外的特殊模块,可以传递导入所有其他模块。在module_4 旁边创建一个module_5.py 内部包dir_a

module_5.py:

print 'module_5'
import dir_c.module_3

现在,从 dir_a 父文件夹中,您可以看到运行不同的模块/子模块时会发生什么:

$ python -m dir_a.module_4
module_4
module_1
module_2

$ python -m dir_a.dir_c.module_3
module_3
module_4
module_1

$ python -m dir_a.module_5
module_5
module_3
module_4
module_1
module_2

【讨论】:

  • 感谢您的建议。刚试了一下,不过ValueError: Attempted relative import beyond toplevel package
  • 相对导入仅适用于包内。假设dir_a是包名,dir_c是子包,你可以在包含dir_a包的目录中尝试python -m dir_a.dir_c.module_3
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 2016-04-09
  • 2012-02-24
  • 2013-04-21
相关资源
最近更新 更多