[英]How to fix 'ImportError: attempted relative import with no known parent package'
[英]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.