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

Per*_*ell 24 python openssl pyenv ubuntu-22.04

全新安装到 Ubuntu 22(我在另一个分区中有 Ubuntu 20),最后一个部分我需要使用它来使 pyenv 正常运行。

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

我“尝试尝试”官方文档的建议

我说“尝试”是因为我不明白我必须做什么。他们发出以下命令:

CPPFLAGS="-I<openssl install prefix>/include" \
LDFLAGS="-L<openssl install prefix>/lib" \
pyenv install -v <python version>
Run Code Online (Sandbox Code Playgroud)

但我不知道“openssl install prefix”是什么意思。我认为这是 openssl 安装目录,所以我这样做了:

openssl version -d
OPENSSLDIR: "/home/linuxbrew/.linuxbrew/etc/openssl@1.1"
Run Code Online (Sandbox Code Playgroud)

尽管我看到这个文件夹中没有任何文件夹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
Run Code Online (Sandbox Code Playgroud)

最终出现相同的错误消息。

不得不说,我尝试了很多在其他地方找到的其他东西,但没有任何效果,但为了简单起见,我坚持使用官方指示。

如果您遇到同样的问题并且解决方案来自这些命令之外的其他地方,请分享!

非常感谢 :)

更新

<openssl install prefix>只是指基本路径或基本文件夹,只是 Homebrew 决定发明一个新名称,因为......好吧,我猜是一些非常重要的原因。

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

请参阅我自己对下面问题的回答,看看它如何对我有用,但根据我所看到和尝试的所有不同解决方案来判断,每种情况可能都需要不同的解决方案。祝你好运!

Per*_*ell 18

关于到底是什么的疑问<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
Run Code Online (Sandbox Code Playgroud)

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

注意:

  • 我尝试在启动时以几种不同的方式设置这些变量,但仅仅这样做是行不通的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)"
Run Code Online (Sandbox Code Playgroud)

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


小智 15

遇到同样的问题,对我来说,它在运行以下命令后起作用(检查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
Run Code Online (Sandbox Code Playgroud)

无需额外标志即可安装。

pyenv install -v 3.9.13
Run Code Online (Sandbox Code Playgroud)


小智 8

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

   sudo apt install libssl-dev 
Run Code Online (Sandbox Code Playgroud)


L. *_*May 5

语境

我在 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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 确保 openssl v3 已通过 apt-get 安装
    sudo apt-get update
    sudo apt-get install openssl libssl-dev
    
    Run Code Online (Sandbox Code Playgroud)
  3. (可选)重新安装 Homebrew openssl
    brew install openssl@1.1
    
    Run Code Online (Sandbox Code Playgroud)

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