一尘不染

Python-如何在Python中进行相对导入?

python

想象一下这个目录结构:

app/
   __init__.py
   sub1/
      __init__.py
      mod1.py
   sub2/
      __init__.py
      mod2.py

我正在编码mod1,我需要从中导入一些东西mod2。我该怎么办?

我尝试过,from ..sub2 import mod2但是得到了“未打包的相对导入尝试”。

我四处搜寻,但只发现"sys.path manipulation"骇客。有没有一种干净的方法?


阅读 348

收藏
2020-02-06

共1个答案

一尘不染

每个人似乎都想告诉你应该做什么,而不仅仅是回答问题。

问题是你通过将mod1.py作为参数传递给解释器而将模块作为__main__运行。

从PEP 328:

相对导入使用模块的__name__属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何软件包信息(例如,将其设置为'__main__'),则相对导入的解析就好像该模块是顶级模块一样,无论该模块实际位于文件系统上的哪个位置。

在Python 2.6中,他们添加了相对于主模块引用模块的功能。 PEP 366描述了更改。

更新:根据Nick Coghlan的建议,推荐的替代方法是使用-m开关运行软件包中的模块。

2020-02-06