如何修复相对导入错误:“没有已知的父包”?
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,如何修复“尝试在非包中进行相对导入”
如何修复 Firebase 9.0 导入错误? “尝试导入错误:‘firebase/app’不包含默认导出(导入为‘firebase’)。”
fastai.vision 导入错误:如何修复导入错误以便我可以使用 ImageDataBunch.from_folder?