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

这一行给出错误

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

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

【问题讨论】:

  • 出于好奇,您使用的是什么版本的python(具体来说,不仅仅是3.x)?

标签: python-3.x python-import importerror


【解决方案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前面
猜你喜欢
  • 2020-11-03
  • 1970-01-01
  • 2021-11-24
  • 2020-10-13
  • 2021-02-07
  • 2020-06-20
  • 2021-10-31
  • 2021-10-20
  • 2021-12-19
相关资源
最近更新 更多