想象一下这个目录结构:
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 manipulation"骇客。有没有一种干净的方法?
"sys.path manipulation"
每个人似乎都想告诉你应该做什么,而不仅仅是回答问题。
问题是你通过将mod1.py作为参数传递给解释器而将模块作为__main__运行。
mod1.py
__main__
从PEP 328:
相对导入使用模块的__name__属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何软件包信息(例如,将其设置为'__main__'),则相对导入的解析就好像该模块是顶级模块一样,无论该模块实际位于文件系统上的哪个位置。
__name__
'__main__'
在Python 2.6中,他们添加了相对于主模块引用模块的功能。 PEP 366描述了更改。
更新:根据Nick Coghlan的建议,推荐的替代方法是使用-m开关运行软件包中的模块。