尽管__init__.py存在于包含目标模块的文件夹中,但导入错误仍然存​​在

时间:2014-10-14 20:14:08

标签: python python-2.7 python-import pythonpath

我在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_4.py中导入module_3.py(例如import dir_a.module_4)。它抱怨说:“没有名为dir_a.module_4的模块”

我在这里缺少什么?我需要在这里混淆virtualenv的PYTHONPATH吗?如果是这样,为什么module_1.pymodule_2.pymodule_3.py的导入在没有触及PYTHONPATH的情况下都很好?

1 个答案:

答案 0 :(得分:1)

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

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_5.py旁边创建dir_a内部包module_4

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