Python包安装后导入正常 直接运行源码报相对导入错误是什么原因
错误原因
- 直接运行
python3 car.py时,Python会把当前运行的脚本所在的目录(也就是src/package_name/)加到sys.path中,同时将该脚本的__name__属性设为__main__,而非它原本的完整模块名package_name.car。此时Python无法识别该脚本属于package_name父包,相对导入语法from .func import *中的.找不到对应的父包层级,就会抛出该错误。 - 从PyPI安装包后使用时,你是通过
import package_name.car这类方式导入模块,Python的包索引机制可以正确识别package_name是顶层包,car是包下的子模块,相对导入的层级关系可以被正常解析,因此不会报错。
解决方法
方案1:以模块方式运行脚本
不要直接运行.py文件,切换到项目根目录(也就是proj/目录)下执行以下命令即可:
python3 -m package_name.car
这种运行方式会把当前工作目录加入sys.path,同时保留模块的完整层级命名,相对导入可以被正常识别。
方案2:修改导入逻辑适配直接运行
如果需要经常直接运行car.py,可以把相对导入改为绝对导入,同时把src目录加入Python路径:
- 把
car.py里的导入语句修改为:
from package_name.func import *
- 运行时指定
PYTHONPATH环境变量,在proj/目录下执行:
PYTHONPATH=./src python3 src/package_name/car.py
也可以在car.py最开头手动添加路径:
import sys from pathlib import Path # 把src目录加入Python路径 sys.path.append(str(Path(__file__).parent.parent.resolve())) # 后续再写导入语句 from package_name.func import *
方案3:新增独立入口脚本
在项目根目录下新增单独的启动脚本,比如run_car.py,内容如下:
from package_name.car import 要执行的入口函数 if __name__ == "__main__": 要执行的入口函数()
之后直接在proj/目录下运行python3 run_car.py即可,不需要修改原有包内的导入逻辑。
内容的提问来源于stack exchange,提问作者user12970426
相关产品推荐
相关产品推荐

