繁体   English   中英

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

[英]How can I fix the relative import error: "with no known parent package"?

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

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

有人遇到同样的问题吗?

from ..lib import *将指示 python 爬到 main.py 的父目录,在那里找到 lib 并从中导入所有内容-即从空的 init 文件中,因此也不会发生任何事情。 您必须将其更改为from ..lib import func; func.hello_func() 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 包。

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

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

然后,您将 main.py 更改为:

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

它会一直有效。 然后,您可以简单地运行python ./main.py

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM