如何修复相对导入错误:"with no known parent package"?

14

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

我有以下项目结构:

proj
|
|---__init__.py
|
|---lib
|    |---__init__.py
|    |---func.py
|
|---src
|    |---main.py
  • __init__.py 是一个空文件。

  • func.py 包含一个打印函数:

def hello_func():
    print("Hello !!!")
from ..lib import *
hello_func()

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

ImportError: attempted relative import with no known parent package

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


2
看起来你正在尝试进行“兄弟包导入”。令人惊讶的是,这是Python粘合在一起的事情之一,解决方案并不美观,而且独特。有更多的方法可以解决,具体取决于你想要什么。 请查看:https://dev59.com/Im015IYBdhLWcg3w6QA0 - waykiki
这个回答解决了您的问题吗?ImportError: 试图相对导入,但未知父包 - Tomerikoo
这些答案中有没有一个回答了你的问题? - Mr_and_Mrs_D
2个回答

4

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 报错 "attempted relative import beyond top-level package"。 - Addison Klinke
1
@AddisonKlinke 请查看更新的答案。 - Mr_and_Mrs_D

2

我已经为Python创建了一个新的实验性导入库: ultraimport

它允许基于文件系统进行导入,无论您如何运行代码或当前工作目录是什么。

然后,您需要将main.py更改为以下内容:

import ultraimport
ultraimport('__dir__/../lib/__init__.py', '*', globals=globals())

并且它总是能正常工作。然后,您只需运行python ./main.py即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接