PyInstaller打包requests程序遇SSL错误:无法导入_ssl模块
解决PyInstaller打包Python脚本后运行EXE出现SSL DLL加载失败的问题
我最近踩了个实实在在的坑:用Anaconda3环境下的Python 3.7写了个脚本,靠requests模块调用API做GET/POST请求,本地直接跑脚本一点问题都没有,但用PyInstaller 3.6打包成EXE之后,一运行就炸锅了。当时用的相关包版本是requests 2.24.0、OpenSSL 1.1.1h。
报错的完整栈信息是这样的:
Traceback (most recent call last): File "site-packages\PyInstaller\loader\rthooks\pyi_rth_certifi.py", line 13, in <module> File "c:\programdata\anaconda3\envs\...\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module File "ssl.py", line 98, in <module> ImportError: DLL load failed: 找不到指定的模块。 [20188] Failed to execute script pyi_rth_certifi
一开始我以为是PyInstaller打包时漏了SSL相关的依赖,在Stack Overflow翻了好几个高赞方案,试了修改spec文件指定ssl路径、手动添加certifi文件之类的操作,结果全没用,问题还是卡在ssl.py导入_ssl模块失败这儿。
最后终于靠cbolwerk的方法解决了,这里把关键要点给大家说清楚:
- 一定要安装最新版本的OpenSSL库,哪怕你的Anaconda环境里已经装了新的OpenSSL,本地系统里的旧版本也会拖后腿导致这个错误
- 亲测这个方案在完全没安装过OpenSSL的目标电脑上也能正常运行,不需要对方额外装OpenSSL
内容的提问来源于stack exchange,提问作者droebi




