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

f5emj3cl  于 2023-01-08  发布在  Python
关注(0)|答案(8)|浏览(233)

移动到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>

但是我不知道"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)即可解决此部分问题。
看看我自己对下面问题的回答,看看它对我是如何工作的,但是从我看到和尝试的所有不同的解决方案来看,每个案例可能需要一个不同的解决方案。祝你好运!

rseugnpd

rseugnpd1#

关于<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设置变量的命令的特定变体:不仅我尝试了但仍然不起作用,而且我需要使用与Python 3.7一起工作的变体来安装其他版本。幸运的是,我可以将我唯一与Python 3.7一起使用的项目更新到一个更新的Python版本,这样我就不再需要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工作正常。

lxkprmvk

lxkprmvk2#

背景

我在Pop!_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

1.确保openssl v3是安装通过apt-get

sudo apt-get update
sudo apt-get install openssl libssl-dev

1.(可选)重新安装Homebrew openssl

brew install openssl@1.1

注意:这不是一个解决方案,而是一个变通方法。它不适合所有人,但希望它对我以外的人有帮助。

nhjlsmyf

nhjlsmyf3#

遇到了同样的问题,对我来说,它在运行以下命令后工作(检查https://github.com/pyenv/pyenv/wiki#sugggested-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
fjaof16o

fjaof16o4#

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

sudo apt install libssl-dev
m1m5dgzv

m1m5dgzv5#

在我的主机上,我必须执行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
omtl5h9j

omtl5h9j6#

只是为了创建一个答案作为一个选项。问题很可能是python3.10的dev头文件还没有在python3-dev中。安装python3.10-dev,你应该可以开始了。

wko9yo5t

wko9yo5t7#

  1. wget http://www.openssl.org/source/openssl-3.0.7.tar.gz(因为https://www.openssl.org/news/secadv/20221101.txt
    1.打开ssl-3.0.7文件
  2. make && sudo make安装
  3. pyenv安装3.x.x(全部正常)
ncecgwcz

ncecgwcz8#

我为同一个问题纠结了整整一个下午,上面提到的解决方案都不起作用,经过一番挖掘,我终于找到了pyenv install使用的gcc的问题(例如,请参见herehere)。
简而言之,Python的安装带有Homebrew管理的构建依赖项;但是,pyenv install似乎使用system gcc而不是Homebrew的gcc,这就产生了问题。一个简单的解决方案对我来说是有效的,就是用pyenv install指向Homebrew的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'

相关问题