如何修复相对导入错误:“没有已知的父包”?

Posted

技术标签:

【中文标题】如何修复相对导入错误:“没有已知的父包”?【英文标题】:How can I fix the relative import error: "with no known parent package"? 【发布时间】:2021-10-16 13:11:23 【问题描述】:

我已经尝试了几天来解决我的项目中的相对导入错误,但没有成功。 我有以下项目树:

proj
|
|---__init__.py
|
|---lib
|    |---__init__.py
|    |---func.py
|
|---src
|    |---main.py

__init__.py 是一个空文件。

func.py 包含打印功能:

def hello_func():
    print("Hello !!!")

main.py:

from ..lib import *
hello_func()

当我运行它时,我收到了这个错误:

ImportError: attempted relative import with no known parent package

有人遇到过同样的问题吗?

【问题讨论】:

看来您正在尝试执行“兄弟包导入”。令人惊讶的是,这是 Python 刚刚粘合在一起的东西之一,解决方案并不漂亮,而且它是独一无二的。有更多的方法可以解决,取决于你想要什么。看看这个:***.com/questions/6323860/sibling-package-imports 这能回答你的问题吗? ImportError : Attempted relative import with no known parent package 任何答案都回答了您的问题吗? 【参考方案1】:

我想先给出解决方案。您可以尝试使用from lib import * 并运行/proj/__init__.py,它对我来说很好。no known parent package错误的原因是因为你运行/proj/src/main.py,这表明/proj/src是根包。 基本上,一个包是用来导入的,而不是用来运行的。也就是说,你不应该在包中运行 python 代码,而是应该导入它。

【讨论】:

【参考方案2】:

from ..lib import * 将指示 python 爬到 main.py 的父目录,在那里找到 lib 并从中导入所有内容 - 即从空的 init 文件中,因此也不会发生任何事情。您必须将其更改为 from ..lib import func; func.hello_func()。这仍然会出现同样的错误。该错误是由于 python 没有像我上面所说的那样考虑目录。 Python 只会在您启动它的工作目录中查找包(以及在 sys.path 列表中,但不要弄乱它)。你得到这个错误是因为你直接从 src 运行你的脚本 - 所以对于 python,“文件系统”的根是 src - 没有已知的(python)父包(文件夹)。这是 python 中的一种反模式(从它们的目录运行脚本)。你应该做的是

$ cd proj/..
$ python -m proj.src.main # note no .py

这使 proj 文件夹成为文件系统的“根”(对于 python),python 将检测其中的所有包 - src.main 告诉 python main.py 是 src 包的一部分,它也被检测到作为 lib(因为它们是 proj 的直接子代),并且当您像 ..lib 那样进行相对导入时,python 已经知道 lib 包。

【讨论】:

~/proj$ python -m src.main 引发“尝试相对导入超出***包” @AddisonKlinke 查看更新的答案

以上是关于如何修复相对导入错误:“没有已知的父包”?的主要内容,如果未能解决你的问题,请参考以下文章

即使使用 __init__.py,如何修复“尝试在非包中进行相对导入”

如何修复 PyDev“导入未定义变量”错误?

如何修复 Firebase 9.0 导入错误? “尝试导入错误:‘firebase/app’不包含默认导出(导入为‘firebase’)。”

fastai.vision 导入错误:如何修复导入错误以便我可以使用 ImageDataBunch.from_folder?

从 aws-lambda 导入 pysftp 时如何修复导入错误“没有名为 '_cffi_backend' 的模块”

将eclipse导入android studio时如何修复错误?(作为build.gradle的编译时依赖项)