Pyinstaller打包后请求币安API出现TLS CA证书bundle找不到错误
问题成因
- PyInstaller默认不会自动收集certifi库的CA证书文件:requests库发起HTTPS请求时默认调用certifi提供的
cacert.pem做TLS证书校验,打包为exe后,程序运行时会先解压到系统临时目录下的_MEIXXXX文件夹,如果你打包时没有显式指定把证书文件打入包内,就会在对应路径找不到证书文件触发报错。 - Python版本升降级破坏了原有依赖匹配:你卸载Python3.10重装3.9.7的操作导致原有
certifi、requests库的版本关联和路径配置被重置,旧的打包配置和新环境的依赖路径不匹配。另外你配置的pip global.cert仅对pip安装包时的校验生效,对打包后独立运行的exe完全无效,exe运行不依赖本地Python环境的配置。 - 币安websocket未触发报错是因为其通信逻辑不依赖requests的证书校验逻辑,要么自带证书、要么跳过了校验,所以不受影响。
解决方案
下面三种方案按优先级选择即可:
- 方案1:打包时自动收集certifi所有资源(无需修改代码,最便捷)
直接在打包命令中添加--collect-data certifi参数,PyInstaller会自动把certifi库的所有数据文件(包含cacert.pem)打进包,不需要手动找证书路径,命令示例:
pyinstaller -F main.py --collect-data certifi
如果需要无控制台窗口,添加-w参数即可。
- 方案2:代码层面全局指定证书路径+打包时添加证书
首先在main.py的最开头(导入requests之前)添加如下代码:
import os import sys # 自动适配打包运行/本地开发两种场景 if getattr(sys, '_MEIPASS', False): # 打包后exe运行时的临时解压目录 ca_path = os.path.join(sys._MEIPASS, 'cacert.pem') else: # 本地开发时调用certifi的证书路径 import certifi ca_path = certifi.where() # 给requests全局设置CA证书路径 os.environ['REQUESTS_CA_BUNDLE'] = ca_path
然后打包时通过--add-data参数把证书打入包,先执行命令获取本地证书路径:
python -c "import certifi; print(certifi.where())"
拿到路径后替换下方命令中的你的证书路径:
pyinstaller -F main.py --add-data "你的证书路径;."
- 方案3:不需要重新打包的临时解决方案
如果你不想重新打包exe,直接把cacert.pem文件复制到exe同级目录即可,运行时会自动在同级目录查找证书。
内容的提问来源于stack exchange,提问作者Notmyname
相关产品推荐
相关产品推荐

