小编典典

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

all

想象一下这个目录结构:

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

我正在编码mod1,我需要从mod2. 我该怎么做?

我试过from ..sub2 import mod2了,但我得到了一个“尝试在非包中进行相对导入”。

我四处搜索,但只发现“sys.path操纵”黑客。没有干净的方法吗?


编辑:我所有__init__.py的目前都是空的

Edit2:我正在尝试这样做,因为 sub2 包含跨子包(,等)共享的sub1subX

Edit3:我正在寻找的行为与PEP 366中描述的行为相同(感谢
John B)


阅读 90

收藏
2022-03-08

共1个答案

小编典典

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

问题是您通过将 mod1.py 作为参数传递给解释器来将模块作为 ‘main‘ 运行。

来自PEP 328

相对导入使用模块的 name
属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何包信息(例如,它被设置为’main‘),那么无论模块实际位于文件系统的哪个位置,相对导入都会被解析为模块是顶级模块。

在 Python 2.6 中,他们添加了相对于主模块引用模块的能力。 PEP
366
描述了这种变化。

更新 :根据 Nick Coghlan 的说法,推荐的替代方法是使用 -m 开关在包内运行模块。

2022-03-08