Sometimes we have different python versions required for various projects, and pyenv is a beautiful tool to make it happen. Unfortunately, the Mac M1 chip is relatively new to the x86 design, so there're sometimes a few strange problems when we try to install python via pyenv, and this blog will share how I install it.
If everything goes well, it should be straightforward to install python through the pyenv.
- Install pyenv first.
brew install pyenv
- Initialize pyenv: To make sure pyenv is properly set up, run the following commands in your terminal:
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile source ~/.bash_profile
if you are usiong zsh, please replace the
- Install python 3.10.9
pyenv install 3.10.9
- Verify the installation
you should see there's Python 3.10.9 in your local list. That's it, pretty simple if all works fine, but sometimes there are some surprises.
Here's an error I faced
dyld: symbol not found in flat namespace '_libintl_bindtextdomain' /bin/sh: line 1: 56600 Abort trap: 6 DYLD_LIBRARY_PATH=/var/folders/73/543qbm7n423dx355b3fvwv3c0000gn/T/python-build.20230210180100.46439/Python-3.10.9 ./python.exe -E -S -m sysconfig --generate-posix-vars generate-posix-vars failed make: *** [pybuilddir.txt] Error 1
This error message suggests that there is an issue with the localization libraries (libintl) required by Python. It seems that these libraries are not found in the flat namespace and are causing the build to fail.
we try reinstalling the missing libraries
brew reinstall gettext
next, specify the include and library directories when building Python
CFLAGS="-I$(brew --prefix gettext)/include" LDFLAGS="-L$(brew --prefix gettext)/lib" pyenv install 3.10.9
and I need to share my existed CFLAGS & LDFLAGS settings in the .zshrc, if you need to, you should combine both.
export LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib -L$(brew --prefix gettext)/lib -L$(brew --prefix libffi)/lib" export CPPFLAGS="-I$(brew --prefix libffi)/include -I$(brew --prefix openssl)/include -I$(brew --prefix readline)/lib" export CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include"
Finally, verify the installation agian, and it works
This blog shows how to successfully install a new python version through pyenv in the Mac M1; happy enjoy it; if there's any mistake, please leave a comment to let me know thanks,