Python子包中导入父包报错:attempted relative import with no known parent package的解决咨询
我之前也碰到过完全一样的问题!先梳理下你的场景:
你的项目结构是这样的:
mechanism │ .gitignore │ dataframe.py │ mechanism.py │ vectors.py │ __init__.py │ ├───examples │ temp.py │ __init__.py
你在examples/temp.py里写了from ..vectors import Vector,但直接运行这个文件时触发了ImportError——这其实是Python的导入规则导致的:相对导入只能在被当作包的一部分导入的模块中生效,而直接运行temp.py时,它会被当作独立的顶级脚本,Python根本识别不到它属于mechanism这个父包,自然没法解析..这种相对路径。
下面给你几个靠谱的解决方案,按推荐程度排序:
1. 用模块方式运行(最推荐,符合Python规范)
你需要切换到**mechanism文件夹的父目录**(也就是包含mechanism的那个文件夹,比如你例子里的C:\Users\gmbra\Downloads\Python Programs\Mechanisms),然后用-m参数以模块的方式运行脚本:
python -m mechanism.examples.temp
这样Python会把mechanism识别为完整的包,相对导入的路径就能被正确解析了。
2. 使用绝对导入
把相对导入改成绝对导入,直接指定完整的包路径:
from mechanism.vectors import Vector
不过要确保mechanism所在的目录在Python的sys.path里——要么手动把这个目录添加到PYTHONPATH环境变量,要么同样用上面的-m方式运行脚本,Python会自动把项目根目录加入sys.path。
3. 临时修改sys.path(应急用,不推荐)
如果你只是想快速测试,不想改运行方式,可以在temp.py的最开头添加代码,手动把父包所在目录加入sys.path:
import sys from pathlib import Path # 获取当前文件的父目录的父目录(也就是mechanism文件夹的路径) sys.path.append(str(Path(__file__).parent.parent)) from vectors import Vector
这种方法虽然能解决问题,但不推荐长期使用——它会破坏包的结构独立性,当项目变大或者出现同名模块时,很容易引发导入冲突。
内容的提问来源于stack exchange,提问作者Gabe Morris

