【问题标题】:How can I fix the relative import error: "with no known parent package"?如何修复相对导入错误:“没有已知的父包”?
【发布时间】:2021-10-16 13:11:23
【问题描述】:

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

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

  • func.py 包含打印功能:

    def hello_func():
        print("Hello !!!")
    
  • main.py:

    from ..lib import *
    hello_func()
    

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

ImportError: attempted relative import with no known parent package

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

【问题讨论】:

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


【解决方案1】:

我想先给出解决方案。您可以尝试使用from lib import * 并运行/proj/__init__.py,它对我来说很好。
no known parent package错误的原因是因为你运行/proj/src/main.py,这表明/proj/src是根包。 基本上,一个包是用来导入的,而不是用来运行的。也就是说,你不应该在包中运行 python 代码,而是应该导入它。

【讨论】:

    【解决方案2】:

    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 引发“尝试相对导入超出顶级包”
    • @AddisonKlinke 查看更新的答案
    猜你喜欢
    • 2021-08-26
    • 2021-06-06
    • 2021-10-27
    • 2020-09-22
    • 2021-12-20
    • 2021-02-07
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多