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

新手上路,请多包涵

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

 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

有人遇到同样的问题吗?

原文由 Ahmed Garssallaoui 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 889
1 个回答

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 包。

原文由 Mr_and_Mrs_D 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题