Python 导入错误,尽管包含目标模块的文件夹中存在_init__u;.py

Python 导入错误,尽管包含目标模块的文件夹中存在_init__u;.py,python,python-2.7,python-import,pythonpath,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 在模块4.py内部,我可以成功导入模块1.py、模块2.py和模块3.py。另一方面,我无法在模块3.py中导入模块4.py

我在一个
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
模块4.py
内部,我可以成功导入
模块1.py
模块2.py
模块3.py
。另一方面,我无法在
模块3.py
中导入
模块4.py
(例如
导入目录模块4
)。它抱怨:“没有名为dir_a.module_4的模块”


我错过了什么?我需要在这里处理我的
virtualenv
的PYTHONPATH吗?如果是这样,为什么导入
module_1.py
module_2.py
module_3.py
都可以,而不必触摸PYTHONPATH?

在这种情况下,我不会弄乱
PYTHONPATH
。我想你需要的是电话。在您的特定情况下,要从子模块(如
module_3
)导入
module_4
,您需要:

from .. import module_4
我将尝试重新创建一个人为的示例,以解释我自己:

模块_1.py:

# import sibling submodule
print 'module_1'
from . import module_2
模块_2.py:

print 'module_2'
模块_3.py:

# import parent module
print 'module_3'
from .. import module_4
模块_4.py:

# import child submodule
print 'module_4'
import dir_b.module_1
另外还有一个额外的特殊模块,可以过渡地导入所有其他模块。在
模块4
旁边的包内
目录a
中创建一个
模块5.py

模块_5.py:

print 'module_5'
import dir_c.module_3
现在,从
目录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

这里的一个附带问题是,拥有子项目
dir_b
dir_c
应该意味着它们可能相互依赖,但决不依赖于高于自身的任何东西。感谢您的建议。刚刚尝试过,但
ValueError:尝试在顶级包之外进行相对导入
相对导入仅在包内有效。假设
dir\u a
是包名,
dir\u c
是子包,您可以从包含
dir\u a
包的目录中尝试
python-m dir\u a.dir\u c.module\u 3