DEBUG.WIKI
京东云;让 AI 进入真实业务;零售 · 物流 · 客服 · 硬件;查看方案 →
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

pip 报 No module named _ssl:装 OpenSSL 不会补回 Python 扩展

pip 缺少 _ssl 先确认实际解释器与扩展构建。区别 CA 验证失败,按分发或独立构建流程修复,保留 OpenSSL 版本与运行时边界。

pip 下载依赖时报告 ModuleNotFoundError: No module named '_ssl',后来安装了 OpenSSL,Python 仍不能导入 ssl。这个错误需要先检查 Python 的原生扩展是否完整:系统里出现 openssl 命令,不会给已经构建好的 Python 自动补出 _ssl。

这条路径适用于 CPython 缺失 ssl 支持、尤其自行构建解释器的情况。若错误是 CERTIFICATE_VERIFY_FAILED,说明已经进入另一类证书验证问题;动态库存在但加载失败的 ImportError,也不能直接等同于没有构建扩展。

用发生错误的解释器检查

以下是终端中的只读诊断示例,/path/to/python 应换成应用实际使用的可执行文件:

"/path/to/python" -c "import sys; print(sys.executable); print(sys.version)"
"/path/to/python" -c "import ssl; print(ssl.OPENSSL_VERSION)"
"/path/to/python" -m pip --version

第一条确认解释器,第二条判断 ssl 能否导入及其所用库版本,第三条确认 pip 归属。openssl version 显示的是那个命令连接的库,不能代替 Python 中的 SSL 版本检查。

如果另一个 pip 可以下载,也只说明另一个解释器可能支持 HTTPS,不能证明应用正在使用的 Python 已修好。先保存应用启动路径、虚拟环境及解释器安装方式,再决定修复哪一套环境。

分发包安装与自行构建采用不同恢复入口

由系统包、环境工具或安装程序提供的 Python,应先按该分发方式检查安装是否完整、是否混入其他版本文件。使用相应工具修复或安装完整的受支持版本,不从别的机器复制一个 _ssl 文件过来;原生扩展还依赖 Python ABI、平台和动态库。

自行构建时,检查完整配置和构建日志,而不是只看最后有无 python 可执行文件。SSL 扩展需要可用的 OpenSSL 头文件与库,只有运行时命令未必够。开发包名称随发行版而变,应按目标系统的构建依赖管理,不能把某个旧发行版的安装命令当成所有 Linux 的通用修复。

日志若明确报告 libssl is too old 或缺少要求的 API,就要检查编译器实际发现了哪份头文件与库。另装新版 OpenSSL 后,如果构建仍命中旧目录,问题不会自行消失;也不能关闭编译告警或删除检查,把不兼容的库强行链接进去。

当前 CPython 的要求应按要安装的 Python 版本核对。Python 3.10 起要求 OpenSSL 1.1.1 或更高,但满足最低编译版本不等于这个库仍适合当前生产使用。不要为了旧环境继续锁在早已停止维护的 OpenSSL 或 Python 上;旧板卡、旧发行版可能需要先安排整体升级或使用供应方支持的运行环境。

在独立位置准备完整解释器

需要重建时,保留原安装、构建日志、依赖清单和应用启动配置,在独立安装前缀准备受支持的 Python。--with-openssl=DIR 从 Python 3.7 起用于指定 OpenSSL 根目录;Python 3.10 起还可按部署需要配置 --with-openssl-rpath,解决运行时库查找。它们不是事后修补现成二进制的开关。

编译与安装应沿项目已经采用的流程执行,核对头文件、链接库与运行时查找是否一致,不替换系统 Python 或全局 libssl 来碰碰运气。这种替换可能影响包管理器和其他服务。若现有平台无法满足新版依赖,先评估受支持的平台迁移,不给出能保证老系统就地升级的结论。

新解释器确认完整后,在最终路径重新建立项目环境,按原依赖清单恢复,并在隔离环境核对应用。虚拟环境通常依赖基础解释器,也不是给缺失 SSL 的基础安装自动增加功能;不要直接覆盖正在运行的旧环境目录。

验证 HTTPS 能力,再切换应用

成功标准包括目标解释器可导入 ssl、显示预期的库版本,自己的 pip 能在保留正常证书验证的条件下访问项目批准的软件源,应用从原入口运行也使用新环境。更换解释器可能影响其他原生依赖,需要一起检查。

不要改成 HTTP 软件源、增加 trusted-host 或关闭证书验证来替代 _ssl。这些措施不会构建缺失的扩展,可能另行削弱下载校验。

切换前保存原启动配置,按既有服务流程安排重启及影响范围。新环境不兼容时,恢复原解释器路径与旧项目环境;保留已知可用版本。回退只撤销环境切换,不能让原来缺失的 SSL 能力变得可用,也不能替代后续的正确升级。