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?
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/[email protected]"
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/[email protected]/include"
LDFLAGS="-L/home/linuxbrew/.linuxbrew/etc/[email protected]/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!
11
Answers
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:
For every new version, I use this command and it works.
Note that:
pyenv install xx.xx
, I always have to use the full command no matter what.Not happy at all with all this mess but at least now I can use 22.04 for working.
Edit: I tried Jakob's suggestion to add it to .bashrc, like this:
Then I did
$SHELL
to reload it, and thenpyenv install xx.xx.xx
worked fine.Had same trouble, for me it worked after ran following command(check https://github.com/pyenv/pyenv/wiki#suggested-build-environment).
Could install without additional flags.
on my host I have to do a
brew install openssl
, it install openssl@3 butbrew --prefix openssl
still links to openssl@1I need to fully type out the path to build python 3.9.13. maybe there is a better way to do a prefix link.
Just to create an answer as an option. The problem is most likely that the dev headers for
python3.10
is not yet inpython3-dev
. Installpython3.10-dev
and you should be good to go.I managed to solve this error by installing libssl-dev on Ubuntu 22.04.1 LTS
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.
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.
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, e.g., 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 withpyenv install
to let pyenv operate in the world it knows: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: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 [email protected] 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.
This solved the issue for me after attempting several other options.
I had your same exact issue.
I am using linuxbrew on Ubuntu 20.04. None of the above answers worked for me, so I opted for keeping it simple and simply not using pyenv provided by brew
uninstall pyenv
brew uninstall pyenv
Install pyenv from source
now you can install
pyenv install 3.11.2
note: pyenv will stop working as soon as you open a new shell. You therefore need to force initialisation. Just update your ~/.profile or ~/.bash_profile ( in this case you need to logout after that) or update your ~/.bashrc
Hope it works for the folks reading like it did for me. It took me longer than a day to figure out the best solution was simply avoid brew for pyenv.
This solution is also elegant because it does not require you to add any alias or uninstall openssl from your brew.