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



使用新安装的Ubuntu22(我在另一个分区中有Ubuntu20),最后一部分我需要使用它来处理它,以使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>

但我不知道";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)即可解决。

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

关于<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工作了。

编辑:我尝试了雅各布的建议,将其添加到.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工作得很好。

也遇到了同样的问题,对我来说,在运行以下命令(checkhttps://github.com/pyenv/pyenv/wiki#suggested-构建环境)。

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

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

sudo apt install libssl-dev 

上下文

我也犯了同样的错误_OS 22.04(基于Ubuntu 22.04),我使用Homebrew作为其软件包管理器之一。

我找不到上面的任何答案,也找不到任何建议https://github.com/pyenv/pyenv/wiki/Common-build-problems工作。

变通办法

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

  1. (暂时)卸载Homebrew openssl
    brew uninstall --ignore-dependencies openssl@1.1
    
  2. 确保openssl v3是通过apt-get安装的
    sudo apt-get update
    sudo apt-get install openssl libssl-dev
    
  3. (可选)重新安装Homebrew openssl
    brew install openssl@1.1
    

注意 :这与其说是一个解决方案,不如说是一种变通方法。这不是为每个人,但希望它对我以外的人有帮助。

我在同一个问题上挣扎了整整一个下午,上面的解决方案都不起作用,经过一点挖掘,我找到了pyenv install使用的gcc的问题。(例如,请参阅此处和此处。)

简言之,Python正在安装Homebrew管理的构建依赖项;然而,pyenv install似乎使用系统gcc而不是Homebrew的gcc,这导致了问题。一个对我有效的简单解决方案是指向Homebrew的带有pyenv install的gcc,让pyenv在它所知道的世界中运行:

CC="$(brew --prefix gcc)/bin/gcc-12" 
pyenv install --verbose 3.9.7

注意:从目录$(brew --prefix gcc)/bin中检查正确的gcc版本(gcc-11gcc-12等)。

为了避免每次运行pyenv install时都必须手动指向Homebrew的gcc,请为Homebrew管理的pyenv安装创建一个别名:

alias pyenv-install-with-brew='CC="$(brew --prefix gcc)/bin/gcc-12" pyenv install'

我也遇到了这个问题,解决这个问题花了不必要的时间。所以我希望这能有所帮助。

1-确保你遵循了为Ubuntu构建pyenv的指南中的步骤(https://github.com/pyenv/pyenv/wiki#suggested-构建环境),并安装了所有必要的apt包。

2-如果where openssl中的第一个项目显示了酿造目录的路径。你可能想要改变这一点。您可以简单地卸载openssl@3和openssl@1.1通过酿造。然后默认情况下应该使用openssl的apt安装。

我第一次尝试使用brew-openssl安装,但没有真正奏效。只有在从brew中卸载openssl后,它才正常工作,没有任何问题。

我也遇到了同样的问题。我在Ubuntu 20.04上使用linuxbrew。上面的答案对我来说都不起作用,所以我选择保持简单,简单地不使用brew 提供的pyenv

卸载pyenv

brew uninstall pyenv

从源安装pyenv

git clone https://github.com/pyenv/pyenv.git $HOME/.pyenv

#install needed dependencies (without brew)
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev 
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm 
libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev 
liblzma-dev python-openssl git

#setup path
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

现在你可以安装了

pyenv install 3.11.2

注意:一旦打开新的shell,pyenv就会停止工作。因此,您需要强制初始化。只需更新你的~/.profile或~/.bash_profile(在这种情况下,你需要在那之后注销)或更新你的~/.bashrc

### Add pyenv if exists 
if [ -d "$HOME/.pyenv" ]; then
#setup python
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
fi

希望它能像对我一样对阅读的人有效。我花了一天多的时间才找到最好的解决方案,就是避免为pyenv酿造啤酒。这个解决方案也很优雅,因为它不需要添加任何别名或从您的brew中卸载openssl。

在我的主机上,我必须做一个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
  1. wgethttp://www.openssl.org/source/openssl-3.0.7.tar.gz(因为https://www.openssl.org/news/secadv/20221101.txt)
  2. tar-xzf openssl-3.07.tar.gz
  3. make&amp;sudo制作安装
  4. pyenv安装3.x.x(一切正常)

只是创建一个答案作为选项。问题很可能是python3.10的dev标头还不在python3-dev中。安装python3.10-dev,就可以开始了。

在尝试了其他几个选项后,这为我解决了问题。

echo 'export PATH="/home/linuxbrew/.linuxbrew/opt/openssl@3/bin:$PATH"' >> /home/*user*/.bashrc

相关内容

  • 没有找到相关文章

最新更新