已创建__init__.py,为何仍出现相对导入错误:无已知父包
相对导入报错
ImportError: attempted relative import with no known parent package的原因 你创建__init__.py标记目录为包的操作是正确的,但触发错误的核心原因是直接运行包内的foo.py脚本文件,具体逻辑如下:
- 当执行
python foo.py时,Python会把foo.py当作顶层脚本,而非某个包的子模块。此时该脚本的__package__属性为空字符串,Python无法识别它所属的父包。 - 相对导入(比如
from .bar import ...)的本质是基于当前模块在包结构中的位置定位目标模块,必须依赖父包的上下文才能解析。没有父包上下文时,Python自然无法处理这种相对路径的导入。
正确的使用方式
要让相对导入生效,你需要将这个目录作为包的一部分来使用,比如:
- 切换到该目录的上级目录,执行
python -m 包目录名.foo(把包目录名替换成你这个文件夹的实际名称) - 或者在包外部的另一个脚本中,通过
from 包目录名 import foo的方式导入使用
你的目录与代码参考
目录结构:
$ ls __init__.py foo.py bar.py
foo.py内容:
from .bar import MyExampleClass thing = MyExampleClass()
bar.py内容:
class MyExampleClass(): pass
触发的错误:
ImportError: attempted relative import with no known parent package
内容的提问来源于stack exchange,提问作者pgierz
相关产品推荐
相关产品推荐

