想象一下这个目录结构:
app/ __init__.py sub1/ __init__.py mod1.py sub2/ __init__.py mod2.py
我正在编码mod1,我需要从mod2. 我该怎么做?
mod1
mod2
我试过from ..sub2 import mod2了,但我得到了一个“尝试在非包中进行相对导入”。
from ..sub2 import mod2
我四处搜索,但只发现“sys.path操纵”黑客。没有干净的方法吗?
sys.path
编辑:我所有__init__.py的目前都是空的
__init__.py
Edit2:我正在尝试这样做,因为 sub2 包含跨子包(,等)共享的sub1类subX。
sub1
subX
Edit3:我正在寻找的行为与PEP 366中描述的行为相同(感谢 John B)
每个人似乎都想告诉你应该做什么,而不仅仅是回答问题。
问题是您通过将 mod1.py 作为参数传递给解释器来将模块作为 ‘main‘ 运行。
来自PEP 328:
相对导入使用模块的 name 属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何包信息(例如,它被设置为’main‘),那么无论模块实际位于文件系统的哪个位置,相对导入都会被解析为模块是顶级模块。
在 Python 2.6 中,他们添加了相对于主模块引用模块的能力。 PEP 366描述了这种变化。
更新 :根据 Nick Coghlan 的说法,推荐的替代方法是使用 -m 开关在包内运行模块。