Ubuntu 22.04 中的 Pyenv:错误:未编译 Python ssl 扩展。缺少 OpenSSL 库?

迁移到全新安装的 Ubuntu 22(我在另一个分区中有 Ubuntu 20),最后一块我需要使用它来运行它以使 pyenv 运行良好。

尝试 pyenv install x.xx.x 时失败并出现以下错误: ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

我“试图尝试”官方文档 proposes

我说“试着尝试”是因为我不明白我必须做什么。他们给出这些命令:

CPPFLAGS="-I<openssl install prefix>/include" 
LDFLAGS="-L<openssl install prefix>/lib" 
pyenv install -v <python version>

但我不知道“openssl 安装前缀”是什么意思。我认为它是 openssl 安装目录,所以我做了:

openssl version -d
OPENSSLDIR: "/home/linuxbrew/.linuxbrew/etc/openssl@1.1"

即使我看到在这个文件夹中没有任何 includelib 子文件夹,我还是尝试了这样做:

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> 只是指基本路径或基本文件夹,只是 Homebrew 决定发明一个新名称,因为......嗯,我猜是一些非常重要的原因。

这部分只需用 <openssl install prefix> 替换 $(brew --prefix openssl) 即可解决。

请参阅我自己对以下问题的回答,了解它对我的工作方式,但从我看到和尝试的所有不同解决方案来看,每个案例都可能需要不同的解决方案。祝你好运!

stack overflow Pyenv in Ubuntu 22.04: ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
原文答案

答案:

作者头像

关于对 <openssl install prefix> 是什么的疑问,我将编辑问题以澄清它。

关于如何成功制作 pyenv 安装版本,在尝试了我发现的关于该主题的所有内容之后,这是唯一对我有用的东西:

LDFLAGS="-Wl,-rpath,$(brew --prefix openssl)/lib" 
CPPFLAGS="-I$(brew --prefix openssl)/include" 
CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl)" 
pyenv install -v 3.9.5

对于每个新版本,我都使用此命令并且它有效。

注意:

  • 我尝试在启动时以几种不同的方式设置这些变量,但仅通过执行 pyenv install xx.xx 并不起作用,无论如何我总是必须使用完整的命令。
  • 不会安装任何 3.7.x 版本。我知道在文档中为 3.7 设置变量的命令有一个特定的变体:不仅我尝试过并且仍然无法工作,而且应该与 3.7 一起工作的变体是我需要使用的安装其他版本。幸运的是,我可以将 3.7 的唯一项目更新为更新的 Python 版本,因此我不再需要 3.7。

对所有这些混乱一点都不满意,但至少现在我可以使用 22.04 来工作。

编辑:我尝试了 Jakob 将其添加到 .bashrc 的建议,如下所示:

export LDFLAGS="-Wl,-rpath,$(brew --prefix openssl)/lib"
export CPPFLAGS="-I$(brew --prefix openssl)/include"
export CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl)"

然后我做了 $SHELL 重新加载它,然后 pyenv install xx.xx.xx 工作正常。

作者头像

有同样的麻烦,对我来说,它在运行以下命令后工作(检查 https://github.com/pyenv/pyenv/wiki#suggested-build-environment )。

sudo apt-get update; sudo apt-get install make build-essential libssl-dev 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.9.13
作者头像

在我的主机上我必须做一个 brew install openssl ,它安装 openssl@3 但 brew --prefix openssl 仍然链接到 openssl@1

我需要完全输入构建 python 3.9.13 的路径。也许有更好的方法来做前缀链接。

LDFLAGS="-Wl,-rpath,/home/linuxbrew/.linuxbrew/opt/openssl@3/lib" 
CPPFLAGS="-I/home/linuxbrew/.linuxbrew/opt/openssl@3/include" 
CONFIGURE_OPTS="--with-openssl=/home/linuxbrew/.linuxbrew/opt/openssl@3" 
pyenv install -v 3.9.13
作者头像

只是为了创建一个答案作为一个选项。问题很可能是 python3.10 的开发标头尚未在 python3-dev 中。安装 python3.10-dev 你应该很高兴。

作者头像

我设法通过在 Ubuntu 22.04.1 LTS 上安装 libssl-dev 解决了这个错误

   sudo apt install libssl-dev 
作者头像

语境

我在 Pop!_OS 22.04(基于 Ubuntu 22.04)中遇到了同样的错误,我使用 Homebrew 作为包管理器之一。

我无法获得上述任何答案,也无法获得任何建议 https://github.com/pyenv/pyenv/wiki/Common-build-problems

解决方法

对我有用的是(暂时)卸载 Homebrew openssl 包,确保通过 apt-get 安装了 openssl v3,然后(可选)通过 Homebrew 重新安装 openssl。

1.(暂时)卸载 Homebrew openssl ```
brew uninstall --ignore-dependencies openssl@1.1

``` 
  1. 确保通过 apt-get ```
    sudo apt-get update
    sudo apt-get install openssl libssl-dev

3.(可选)重新安装 Homebrew openssl ```
brew install openssl@1.1

``` 

**Note** :这与其说是一种解决方案,不如说是一种变通方法。它并不适合所有人,但希望它对我以外的人有所帮助。