PyInstaller打包调用requests的自定义包可执行文件缺失TLS CA证书报错
问题成因
这个报错是PyInstaller依赖扫描逻辑与Python 3.10导入机制变动不兼容共同导致的,和你是否直接在入口脚本导入requests直接相关,具体逻辑如下:
- requests库的TLS证书校验依赖certifi包提供的
cacert.pem资源文件,PyInstaller打包时需要主动识别到certifi依赖,才会把对应的资源文件打包进最终的可执行程序。 - 当你把逻辑封装到自定义包,入口脚本仅导入自定义包、没有直接导入requests时,适配Python 3.9及更早版本的PyInstaller,无法识别Python 3.10调整后的深层导入元数据,会漏掉对requests下层依赖certifi的资源收集,最终打包出的程序运行时,自然不会在临时目录生成certifi文件夹和对应的pem文件,触发路径无效报错。
- 你把自定义包逻辑直接写在入口脚本、或者入口脚本直接导入requests时,PyInstaller的浅层扫描就能直接识别到requests依赖,连带完成certifi资源的收集,所以运行正常。
- 降级到Python 3.9后问题自动解决,是因为Python 3.9的导入元数据结构和旧版PyInstaller的扫描逻辑完全适配,就算是自定义包下层导入的requests,也能被正确识别到完整依赖链。
不降级Python 3.10的修复方案
如果你需要继续使用Python 3.10,任选以下一种方案即可解决问题:
- 在入口脚本的顶部添加一行
import certifi,无需调用相关功能,仅需导入即可让PyInstaller识别到该依赖,完成资源收集 - 打包时手动添加certifi资源参数,命令示例如下(注意替换为你本地实际的cacert.pem路径):
PyInstaller -F --add-binary "C:\Python310\Lib\site-packages\certifi\cacert.pem;certifi/" api_interaction_script.py
- 升级PyInstaller到4.7及以上版本,该版本开始正式适配Python 3.10的导入机制,可正确识别深层依赖的资源文件。
内容的提问来源于stack exchange,提问作者Rajendra Kodumuri
相关产品推荐
相关产品推荐

