我在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.py
,module_2.py
和module_3.py
。另一方面,我无法在module_4.py
中导入module_3.py
(例如import dir_a.module_4
)。它抱怨说:“没有名为dir_a.module_4的模块”
我在这里缺少什么?我需要在这里混淆virtualenv
的PYTHONPATH吗?如果是这样,为什么module_1.py
,module_2.py
和module_3.py
的导入在没有触及PYTHONPATH的情况下都很好?
答案 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