想象一下这个目录结构:
app/
__init__.py
sub1/
__init__.py
mod1.py
sub2/
__init__.py
mod2.py
我正在编码mod1
,我需要从中导入一些东西mod2
。我该怎么办?
我尝试过,from ..sub2 import mod2
但是得到了“未打包的相对导入尝试”。
我四处搜寻,但只发现"sys.path manipulation"
骇客。有没有一种干净的方法?
每个人似乎都想告诉你应该做什么,而不仅仅是回答问题。
问题是你通过将mod1.py
作为参数传递给解释器而将模块作为__main__
运行。
从PEP 328:
相对导入使用模块的__name__
属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何软件包信息(例如,将其设置为'__main__'
),则相对导入的解析就好像该模块是顶级模块一样,无论该模块实际位于文件系统上的哪个位置。
在Python 2.6中,他们添加了相对于主模块引用模块的功能。 PEP 366描述了更改。
更新:根据Nick Coghlan的建议,推荐的替代方法是使用-m开关运行软件包中的模块。