简体   繁体   中英

Pyenv in Ubuntu 22.04: ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Moving to Ubuntu 22 with a fresh install (I have Ubuntu 20 in another partition) and the last piece I need to use it for working it to have pyenv running fine.

When trying to pyenv install x.xx.x it fails with this error: ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib? ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

I "tried to try" what the official docs proposes :

I said "tried to try" because I don't understand what I have to do. They give these commands:

CPPFLAGS="-I<openssl install prefix>/include" \
LDFLAGS="-L<openssl install prefix>/lib" \
pyenv install -v <python version>

But I don't know what the "openssl install prefix" means. I assumed it's the openssl installation dir, so I did:

openssl version -d
OPENSSLDIR: "/home/linuxbrew/.linuxbrew/etc/openssl@1.1"

Even though I see that in this folder there arent' any include or lib subfolders, I tried it anyway by doing this:

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

Which ended up with the same error message.

Gotta say, I tried a lot of other stuff that I found in other places and nothing worked, but for the sake of simplicity I'm sticking with the official indications.

If you faced the same problem and the solution came from somewhere else than these commands, please share!

Many thanks:)

Update

<openssl install prefix> just refers to the base path or base folder, just that Homebrew decided to invent a new name because... well, some very important reason I guess.

This part gets solved by just replacing <openssl install prefix> by $(brew --prefix openssl) .

See my own answer to the question below to see how it worked for me, but judging for all the different solutions that I've been seeing and trying, every case might need a different solution. Good luck!

Context

I had the same error from Pop._OS 22.04 (based on Ubuntu 22,04). which I use Homebrew as one of the package managers for.

I could not get any of the answers above to work, nor any of the suggestions https://github.com/pyenv/pyenv/wiki/Common-build-problems to work.

Workaround

What worked for me was (temporarily) uninstalling the Homebrew openssl package, making sure openssl v3 was installed via apt-get, and then (optionally) reinstalling openssl via Homebrew.

  1. (temporarily) uninstall Homebrew openssl
     brew uninstall --ignore-dependencies openssl@1.1
  2. make sure openssl v3 is installed via apt-get
     sudo apt-get update sudo apt-get install openssl libssl-dev
  3. (optionally) reinstall Homebrew openssl
     brew install openssl@1.1

Note : This isn't a solution so much as a workaround. It's not for everyone, but hopefully it's helpful for someone beyond me.

About the doubt on what <openssl install prefix> is, I'll edit the question clarifying it.

About how to make pyenv install versions successfully, after trying everything I found about the topic that's the only thing that worked for me:

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

For every new version, I use this command and it works.

Note that:

  • I tried to set these vars at startup, in a couple of different ways, and it didn't work by just doing pyenv install xx.xx , I always have to use the full command no matter what.
  • It won't install any 3.7.x version. I know in the docs there's a specific variation of the command setting a variable for the 3.7: not only I tried that and still doesn't work, but the variation that's suposed to work with 3.7, is what I needed to use in order to install the other versions. Luckily I could update the only project I had with 3.7 to a newer Python version so I don't need 3.7 anymore.

Not happy at all with all this mess but at least now I can use 22.04 for working.

I managed to solve this error by installing libssl-dev on Ubuntu 22.04.1 LTS

   sudo apt install libssl-dev 

I also had this problem and it took unnecessarily long to solve it. So I hope this helps.

1- Make sure that you followed the steps in the build guide of pyenv for Ubuntu (https://github.com/pyenv/pyenv/wiki#suggested-build-environment ) and installed all the necessary apt packages.

2- If the first item in where openssl shows a path to brew dirs. You might want to change this. You can simply uninstall openssl@3 and openssl@1.1 via brew. Then it should use the apt installation of openssl by default.

I first tried to make it work with brew openssl installation but nothing really worked. Only after uninstalling openssl from brew it worked without any issues.

Had same trouble, for me it worked after ran following command(checkhttps://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

Could install without additional flags.

pyenv install -v 3.9.13

on my host I have to do a brew install openssl , it install openssl@3 but brew --prefix openssl still links to openssl@1

I need to fully type out the path to build python 3.9.13. maybe there is a better way to do a prefix link.

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

Just to create an answer as an option. The problem is most likely that the dev headers for python3.10 is not yet in python3-dev . Install python3.10-dev and you should be good to go.

  1. wget http://www.openssl.org/source/openssl-3.0.7.tar.gz (because https://www.openssl.org/news/secadv/20221101.txt )
  2. tar -xzf openssl-3.0.7.tar.gz
  3. make && sudo make install
  4. pyenv install 3.xx (all fine)

I struggled with the same issue for a whole afternoon, with none of the solutions above working, and with a little bit of digging, tracked the problem down to issues with the gcc that pyenv install uses. (See, eg, here and here .)

In short, Python is being installed with Homebrew-managed build dependencies; however, pyenv install seems to use system gcc instead of Homebrew's gcc, which causes issues. A simple solution that worked for me is to point at Homebrew's gcc with pyenv install to let pyenv operate in the world it knows:

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

Note: check the correct gcc version ( gcc-11 , gcc-12 , etc.) from the directory $(brew --prefix gcc)/bin .

To avoid having to manually point to Homebrew's gcc every time running pyenv install , create an alias for Homebrew-managed pyenv installation:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM