Python同级相对导入报错:‘no known parent package’问题排查
解决Python相对导入"no known parent package"错误
问题复现
项目结构
project/ ├── __init__.py ├── bar.py ├── foo.py └── main.py
代码内容
- bar.py:
from .foo import Foo class Bar: def __init__(self): print("Bar initialized with", Foo()) - foo.py:
class Foo: def __init__(self): print("Foo initialized") - main.py:
from bar import Bar if __name__ == "__main__": Bar()
报错情况
在project目录下执行python main.py,抛出错误:
ImportError: attempted relative import with no known parent package
原因分析
直接运行python main.py时,Python会将main.py所在的project/目录加入sys.path,并把main.py当作顶层脚本执行——此时Python不会把project识别为一个包,因此bar.py中的相对导入from .foo import Foo找不到对应的父包上下文。
彻底修复方案
不需要修改代码或调整sys.path/PYTHONPATH,只需通过Python的-m参数以模块方式运行main.py:
- 切换到
project目录的父目录(比如project路径是~/mycode/project,就执行cd ~/mycode) - 执行命令:
python -m project.main
原理说明
使用-m参数时,Python会将当前目录(project的父目录)加入sys.path,并把project当作一个包来加载。此时bar.py作为project包的一部分,相对导入就能正常识别父包上下文,顺利导入foo.py中的内容。
内容的提问来源于stack exchange,提问作者Umberto Fontanazza
相关产品推荐
相关产品推荐

