【问题标题】:Pyenv in Ubuntu 22.04: ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?Ubuntu 22.04 中的 Pyenv:错误:未编译 Python ssl 扩展。缺少 OpenSSL 库?
【发布时间】:2022-11-11 19:31:17
【问题描述】:

迁移到全新安装的 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

最终得到相同的错误消息。

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

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

非常感谢 :)

更新

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

这部分只需将&lt;openssl install prefix&gt; 替换为$(brew --prefix openssl) 即可解决。

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

【问题讨论】:

    标签: python openssl pyenv ubuntu-22.04


    【解决方案1】:

    关于&lt;openssl install prefix&gt; 是什么的疑问,我将编辑问题以澄清它。

    关于如何成功制作 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 工作正常。

    【讨论】:

    • 如果您在 .bashrc 中导出标志和配置,这是否有效?
    • Jakob 我不确定,我记得尝试过但没有工作,但可能是使用不同的变量,下次我需要使用时,我会再次尝试那些证明对我有用的变量。无论如何,谢谢你的想法!
    • 我通过安装特定于我的版本 python3.10-dev 的 python 标头来修复它?
    • 刚刚尝试过并且工作正常!我正在更新答案..
    【解决方案2】:

    有同样的麻烦,对我来说它在运行以下命令后工作(检查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
    

    【讨论】:

    • 非常感谢您的回答,我已经尝试过了,但根本没有用。但是我发现了一些事情,我将添加详细信息...
    • 这在 Ubuntu 22.04 上对我来说效果很好。我通过从 repos 克隆安装了 pyenv,然后将环境导出添加到 .bashrc 就是这样。
    【解决方案3】:

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

       sudo apt install libssl-dev 
    

    【讨论】:

      【解决方案4】:

      在我的主机上我必须做一个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
      

      【讨论】:

      • 在我的情况下,--prefix 返回了正确的,所以我可以使用该变量,但肯定这对其他人有帮助,谢谢!
      • 目前 (2022-11),openssl 公式是openssl@3 的别名。 openssl@1.1 是一个不同的公式。您可以指定与brew --prefix openssl@3brew --prefix openssl@1.1 一起使用哪一个。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

          这与其说是一种解决方案,不如说是一种解决方法。它适用于所有人,但希望它对我以外的人有所帮助。

        【讨论】:

          猜你喜欢
          • 2022-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-14
          • 2023-01-16
          • 2016-10-11
          • 2014-09-08
          相关资源
          最近更新 更多