pythonpython-3.xpyenvpyenv-virtualenv

Install python 3.6.* on Mac M1


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.*


Solution

  • 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