Ubuntu 22.04下pyenv安装Python报缺失OpenSSL致SSL扩展未编译
pyenv安装Python版本提示SSL扩展未编译、缺少OpenSSL库的解决方法
问题复现场景
- 全新安装Ubuntu 22.04系统(另一分区保留原有Ubuntu 20系统),配置pyenv工作环境阶段,执行
pyenv install <版本号>安装Python时抛出报错:ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib? - 参照pyenv官方文档的常见问题方案操作时,无法理解官方编译命令中
<openssl install prefix>参数的含义,官方给出的参考命令如下:
CPPFLAGS="-I<openssl install prefix>/include" \ LDFLAGS="-L<openssl install prefix>/lib" \ pyenv install -v <python version>
- 初期误将该参数理解为OpenSSL配置目录,执行
openssl version -d得到返回值OPENSSLDIR: "/home/linuxbrew/.linuxbrew/etc/openssl@1.1",在发现该路径下不存在include、lib子文件夹的情况下,仍尝试将该路径代入命令安装Python 3.10.0,执行命令如下,运行后依旧抛出相同错误:
CPPFLAGS="-I/home/linuxbrew/.linuxbrew/etc/openssl@1.1/include" \ LDFLAGS="-L/home/linuxbrew/.linuxbrew/etc/openssl@1.1/lib" \ pyenv install -v 3.10.0
- 尝试多份网络检索到的第三方方案均未生效,优先基于官方指引逻辑排查问题。
核心原因
<openssl install prefix>指代的是OpenSSL的根安装目录,而非openssl version -d返回的OpenSSL配置文件存储目录。后者仅存放OpenSSL的证书、运行配置文件,不包含Python编译依赖的头文件(include目录)和动态链接库(lib目录),路径代入后自然无法找到依赖文件。
对应解决方案
场景1:通过Linuxbrew/ Homebrew安装OpenSSL
不需要手动拼接路径,直接通过brew内置命令获取正确的OpenSSL根安装路径即可,执行以下命令安装目标Python版本:
CPPFLAGS="-I$(brew --prefix openssl)/include" \ LDFLAGS="-L$(brew --prefix openssl)/lib" \ pyenv install -v 3.10.0
执行安装前可先单独运行brew --prefix openssl,确认返回的路径下确实存在include和lib子文件夹,避免路径偏差。
场景2:通过apt安装系统级OpenSSL(Ubuntu 22.04默认场景)
先安装Python编译所需的全量依赖包(含OpenSSL开发版),安装完成后直接执行pyenv安装命令即可,不需要手动指定编译参数:
sudo apt update sudo apt install -y libssl-dev build-essential zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev pyenv install -v 3.10.0
注意事项
不同环境下OpenSSL的安装路径存在差异,不要直接照搬网络上的固定路径值,确认路径下存在编译需要的对应子目录后再代入参数,否则会反复触发相同报错。
内容的提问来源于stack exchange,提问作者Pere Picornell
相关产品推荐
相关产品推荐

