15

I'm trying to run an old app that requires python < 3.7. I'm currently using python 3.9 and need to use multiple versions of python.

I've installed pyenv-virtualenv and pyenv and successfully installed python 3.7.13. However, when I try to install 3.6.*, I get this:

$ pyenv install 3.6.13
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.6.13.tar.xz...
-> https://www.python.org/ftp/python/3.6.13/Python-3.6.13.tar.xz
Installing Python-3.6.13...
python-build: use tcl-tk from homebrew
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 12.3.1 using python-build 2.2.5-11-gf0f2cdd1)

Inspect or clean up the working tree at /var/folders/r5/xz73mp557w30h289rr6trb800000gp/T/python-build.20220413143259.33773
Results logged to /var/folders/r5/xz73mp557w30h289rr6trb800000gp/T/python-build.20220413143259.33773.log

Last 10 log lines:
checking for --with-cxx-main=<compiler>... no
checking for clang++... no
configure:

  By default, distutils will build C++ extension modules with "clang++".
  If this is not intended, then set CXX on the configure command line.
  
checking for the platform triplet based on compiler characteristics... darwin
configure: error: internal configure error for the platform triplet, please file a bug report
make: *** No targets specified and no makefile found.  Stop.

Is there a way to solve this? I've looked and it seems like Mac M1 doesn't allow installing 3.6.*

tuemar29
  • 218
  • 1
  • 2
  • 9
  • I would probably spend more time seeing what actually needs to be upgraded to make it run with a new version of Python. – chepner Apr 13 '22 at 18:41
  • are you going to use python for arm, or x86 through rosetta? – G.S Apr 13 '22 at 18:43
  • I'm going to use python for ARM – tuemar29 Apr 13 '22 at 18:45
  • ok, the easiest experience I've had installing python for arm was by installing miniconda with homebrew, and then using conda environments to create the python3.6 environment – G.S Apr 13 '22 at 18:58

3 Answers3

28

Copying from a GitHub issue.


I successfully installed Python 3.6 on an Apple M1 MacBook Pro running Monterey using the following setup. There is probably some things in here that can be removed/refined... but it worked for me!

#Install Rosetta
/usr/sbin/softwareupdate --install-rosetta --agree-to-license

# Install x86_64 brew
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

# Set up x86_64 homebrew and pyenv and temporarily set aliases
alias brew86="arch -x86_64 /usr/local/bin/brew"
alias pyenv86="arch -x86_64 pyenv"

# Install required packages and flags for building this particular python version through emulation
brew86 install pyenv gcc libffi gettext
export CPPFLAGS="-I$(brew86 --prefix libffi)/include -I$(brew86 --prefix openssl)/include -I$(brew86 --prefix readline)/lib"
export CFLAGS="-I$(brew86 --prefix openssl)/include -I$(brew86 --prefix bzip2)/include -I$(brew86 --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include -Wno-implicit-function-declaration" 
export LDFLAGS="-L$(brew86 --prefix openssl)/lib -L$(brew86 --prefix readline)/lib -L$(brew86 --prefix zlib)/lib -L$(brew86 --prefix bzip2)/lib -L$(brew86 --prefix gettext)/lib -L$(brew86 --prefix libffi)/lib"

# Providing an incorrect openssl version forces a proper openssl version to be downloaded and linked during the build
export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA=openssl@1.0

# Install Python 3.6
pyenv86 install --patch 3.6.15 <<(curl -sSL https://raw.githubusercontent.com/pyenv/pyenv/master/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0008-bpo-45405-Prevent-internal-configure-error-when-runn.patch\?full_index\=1)

Note, the build succeeds but gives the following warning

WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?

running pyenv versions shows that 3.6.15 can be used normally by the system

dontirun
  • 296
  • 3
  • 3
  • 5
    ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib? This is the error I get, so I assume that a proper openssl version is not forced. Has anyone else encountered this while following the above steps? If so, how did you overcome it? – mrj Jul 19 '22 at 19:43
  • This worked to me, but have to mark the terminal to 'open with Rosetta' – DevBush Dec 04 '22 at 20:21
  • @mrj Could you find a solution for the ssl issue? – Omkar Kulkarni Feb 03 '23 at 02:00
  • @OmkarKulkarni yes - on the line: brew86 install pyenv gcc libffi gettext, add openssl (but only do this before the last line in the instructions (pyenv86 install --patch...) If you already did that, uninstall everything and start over, but with the openssl added to the brew86 install cmd – mrj Feb 04 '23 at 21:22
6

After spending days following each and every tutorial on the Web without success, I found out thanks to a co-worker that a plain brew install pyenv followed by pyenv install 3.6 now works on M1.

$ sw_vers
ProductName:    macOS
ProductVersion: 12.6.2
BuildVersion:   21G320

No rosetta, no x86 tricks, just plain ARM, maybe something has changed in the meantime?

Caveat: you could run into problems when using packages that do not yet run on ARM architecture natively, like PyTorch (experimental support only)

EDIT: in the comments it's reported that pyenv install 3.6.15 works with Mac mounting an M2 chipset with Ventura 13.4 OSX version, earlier Python versions couldn't be installed, though.

Alessandro S.
  • 875
  • 12
  • 24
  • Well you could run into problems when using packages that do not yet run on ARM architecture natively, like PyTorch (experimental support only) – fabmeyer Mar 31 '23 at 09:39
  • I haven't encountered any issues yet but I guess you are right – Alessandro S. Mar 31 '23 at 15:33
  • I have added your remark as "caveat" at the end of the answer, so people are aware of potential issues – Alessandro S. Mar 31 '23 at 18:13
  • 1
    I have a new M2 with Ventura 13.4 and need to run a 3.6 Python to maintain an older couple of projects that can't have their Python rev updated at this time. After suffering many trials and tribulations using Rosetta, x86 Brew, MacPorts, compiler flags out the ying yang.. I stumbled upon this and it works!! One note though.. only worked for 3.6.15, not for any earlier 3.6 versions. So for me the command was: 'pyenv install 3.6.15'. Funny that this seems relatively unknown at this time, isn't it? – Paul Brackin Aug 10 '23 at 17:45
  • @PaulBrackin thanks for sharing, I was in the same exact situation with M1 and a legacy project, I tried all you suggest too and was surprised the simplest approach worked. I have updated the answer with your extra info, thanks again. – Alessandro S. Aug 23 '23 at 07:40
1

Adding to the answer of dontirun.

You might get the error as below.

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/kullya/.pyenv/versions/3.6.15/lib/python3.6/ssl.py", line 101, in <module>
    import _ssl             # if we can't import it, let the error propagate
ModuleNotFoundError: No module named '_ssl'
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

This is because you have another openssl version already installed that is higher to 1.0, possibly 3. You can update the commands as highlighted below.

#Install Rosetta
/usr/sbin/softwareupdate --install-rosetta --agree-to-license

# Install x86_64 brew
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

# Set up x86_64 homebrew and pyenv and temporarily set aliases
alias brew86="arch -x86_64 /usr/local/bin/brew"
alias pyenv86="arch -x86_64 pyenv"

# Install required packages and flags for building this particular python version through emulation
brew86 install pyenv gcc libffi gettext

# -------------- change to openssl@1.1 here and others as well ----------+
#                                                                        ↓
export CPPFLAGS="-I$(brew86 --prefix libffi)/include -I$(brew86 --prefix openssl@1.1)/include -I$(brew86 --prefix readline)/lib"
export CFLAGS="-I$(brew86 --prefix openssl@1.1)/include -I$(brew86 --prefix bzip2)/include -I$(brew86 --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include -Wno-implicit-function-declaration" 
export LDFLAGS="-L$(brew86 --prefix openssl@1.1)/lib -L$(brew86 --prefix readline)/lib -L$(brew86 --prefix zlib)/lib -L$(brew86 --prefix bzip2)/lib -L$(brew86 --prefix gettext)/lib -L$(brew86 --prefix libffi)/lib"

# Providing an incorrect openssl version forces a proper openssl version to be downloaded and linked during the build
export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA=openssl@1.1

# Install Python 3.6
pyenv86 install --patch 3.6.15 <<(curl -sSL https://raw.githubusercontent.com/pyenv/pyenv/master/plugins/python-build/share/python-build/patches/3.6.15/Python-3.6.15/0008-bpo-45405-Prevent-internal-configure-error-when-runn.patch\?full_index\=1)
Omkar Kulkarni
  • 1,091
  • 10
  • 22
  • OS X 12.6.2 using python-build 20180424, failing at openSSL even with these instructions – Alessandro S. Feb 22 '23 at 09:01
  • @AlessandroS. Maybe you should use brew86 uninstall openssl first, then run all the commands in this post, not only the last two commands. – fitz Mar 05 '23 at 12:08
  • I have added as a separate answer that now everything works out of the box on M1, something must have changed since nobody mentions that! – Alessandro S. Mar 06 '23 at 13:09