尝试在没有已知父包的情况下进行相对导入

Posted

技术标签:

【中文标题】尝试在没有已知父包的情况下进行相对导入【英文标题】:Attempted relative import with no known parent package 【发布时间】:2019-07-31 18:29:51 【问题描述】:
from ..box_utils import decode, nms

这一行给出错误

ImportError:

这个错误是什么以及如何解决这个错误?

【问题讨论】:

出于好奇,您使用的是什么版本的python(具体来说,不仅仅是3.x)? 【参考方案1】:

如果另一个字典包含script.py,则可以从根目录访问它。例如:

如果您的程序是结构化的...:

/alpha
  /beta
    /delta
  /gamma
    /epsilon
      script.py
    /zeta

...那么epsilon目录中的脚本可以被调用:

from alpha.gamma.epsilon import script

【讨论】:

但是如果你想导入一个文件,而不引用根包怎么办?例如,如果想从delta 导入gamma/epsilon.py 并带有相对引用(即,不引用alpha @svangordon 我也会感兴趣。或者换句话说,beta 是一个包,而 gamma 是另一个包。但它们不是 alpha 的两个子包。如何处理? @svangordon:我想我想通了。如果它们都是包(即在 beta 和 gamma 中有 _ _ init _ _ .py 文件,但在 alpha 中没有),请进入 alpha 目录并输入:pip install -e .。当两个包在那个目录中时我没有尝试过,但至少如果目录中只有一个包并且你这样做,你可以在另一个 Python 文件类型import betaimport beta.delta【参考方案2】:
package
   |--__init__.py
   |--foo.py
   |--bar.py

bar.py的内容

from .foo import func
...

如果有人收到与 from .foo import func 完全相同的错误。

这是因为你忘了把它做成一个包。所以你只需要在package 目录中创建__init__.py

【讨论】:

即使package目录中存在init.py,错误依然存在 确认是__init__.py __init__.py 文件没有区别(我认为从 Python 3.3 开始不再需要它)。这对我也不起作用(有或没有__init__.py),我不知道为什么。【参考方案3】:

显然,box_utils.py 不是软件包的一部分。您仍然可以导入此文件中定义的函数,但前提是尝试导入这些函数的 python 脚本与box_utils.py 位于同一目录中,请参阅this answer。

Nota bene:在我的例子中,我偶然发现了一个带有一个句点的 import 语句的错误,如下所示: from .foo import foo。然而,这种语法告诉 Python foo.py 是包的一部分,但事实并非如此。删除句号后,错误消失了。

【讨论】:

如何让它成为包的一部分? 在同一目录下放一个名为__init.py__的文件 我确实添加了 __ init __.py 这对我有用。只需删除 .在from .foo import foo的foo前面

以上是关于尝试在没有已知父包的情况下进行相对导入的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:尝试在没有已知父包的情况下进行相对导入(Python 3)

Python错误-ImportError:尝试使用没有已知父包的相对导入[重复]

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

Django,将模型类导入新文件。导入错误尝试在没有已知父项的情况下进行相对导入

webpack 3 sass-loader 无法导入没有相对路径的 scss 文件

Python 包的相对导入讲解