使用新安装的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"
尽管我看到这个文件夹中没有任何include
或lib
子文件夹,但我还是尝试了一下:
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。
- (暂时)卸载Homebrew openssl
brew uninstall --ignore-dependencies openssl@1.1
- 确保openssl v3是通过apt-get安装的
sudo apt-get update sudo apt-get install openssl libssl-dev
- (可选)重新安装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-11
、gcc-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
- wgethttp://www.openssl.org/source/openssl-3.0.7.tar.gz(因为https://www.openssl.org/news/secadv/20221101.txt)
- tar-xzf openssl-3.07.tar.gz
- make&;sudo制作安装
- 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