尝试在没有已知父包的情况下进行相对导入
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 beta
或import 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,将模型类导入新文件。导入错误尝试在没有已知父项的情况下进行相对导入