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

Ahm*_*oui 14 python python-3.x relative-import

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

proj
|
|---__init__.py
|
|---lib
|    |---__init__.py
|    |---func.py
|
|---src
|    |---main.py
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我收到此错误:

ImportError: attempted relative import with no known parent package
Run Code Online (Sandbox Code Playgroud)

有人遇到同样的问题吗?

Mr_*_*s_D 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
Run Code Online (Sandbox Code Playgroud)

这使得 proj 文件夹成为文件系统的“根”(对于 python),并且 python 将检测其中的所有包 - 告诉src.mainpython main.py 是被检测到的 src 包的一部分以及 lib (因为它们是proj 的直接子项),并且当您像在 python 中那样进行相对导入时,..lib已经知道 lib 包。