Ошибка при установке некоторых версий Python на MacOS

Предупреждение
Последний раз данная статья обновлялась 21.08.2022, информация может быть устаревшей.
UPD
Наиболее логичный вариант - использовать последнюю версию нужной ветки. Например, вместо python 3.7.3 поставить python 3.7.13.

Покопавшись в том, что приводит к ошибке выяснилось, что старым версиям python не нравится компилятор С/С++, который идет в комплекте с CommandLine Tools. Из чего следует, что нужно поставить другую версию этого компилятора и подсунуть ее при установке. В новых версиях MacOS (видимо, свежее Catalina) Apple перестал поддерживать старые версии python из-за наличия обнаруженных в них уязвимостей. Например, из ветки python 3.7 нормально будут ставиться python >=3.7.4.

При этом некоторые старые версии все же удалось поставить при помощи описанных ниже манипуляций. Поставились версии 3.5.3, 3.5.10, 3.6.0

  1. Установим необходимые библиотеки через brew
brew install pyenv bzip2 zlib xz openssl@1.1
  1. Подсунем их при установке вместо аналогов из CommandLine Tools
1
CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix readline)/include -I$(xcrun --show-sdk-path)/usr/include" LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install 3.7.13
  1. Устанавливаем gcc через brew
1
brew install gcc
  1. Меняем С compiler на установленный и в этой же строке ставим нужную версию python через патч (3.x.x - заменить нужной версией)
1
CC=gcc-12 pyenv install --patch 3.x.x < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch)

gcc-12 тоже следует заменить на версию, которая была установлена через brew

На Macbook с процессорами Apple Silicon (M1 и т.п.) может вывалиться еще одна ошибка:

configure: error: Unexpected output of 'arch' on OSX

В этом случае можно попробовать добавить в команду установки еще одну инструкцию:

1
CC=gcc-12 arch -x86_64 pyenv install --patch 3.5.3 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch)

Если это не помогло, советуют запустить терминал через Rosetta 2 и попробовать установить командой из п.2. Дальше не копал, т.к. у меня нет мака на M1.

При всем этом установка python 3.7.3 валится с ошибкой именно на MacOS Monterey (а точнее - выше Catalina):

1
pyenv install 3.7.3
# faild
BUILD FAILED (OS X 12.5 using python-build 20180424)
#...
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.
1
pyenv install --patch 3.7.3 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch)
# faild
BUILD FAILED (OS X 12.5 using python-build 20180424)
#...
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.
1
CC=gcc-12 pyenv install 3.7.3
# faild
BUILD FAILED (OS X 12.5 using python-build 20180424)
#...
make: *** [Modules/posixmodule.o] Error 1
make: *** Waiting for unfinished jobs....
1
CC=gcc-12 pyenv install --patch 3.7.3 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch)
# faild
BUILD FAILED (OS X 12.5 using python-build 20180424)
#...
Last 10 log lines:
if test "xupgrade" != "xno"  ; then \
		case upgrade in \
			upgrade) ensurepip="--upgrade" ;; \
			install|*) ensurepip="" ;; \
		esac; \
		 ./python.exe -E -m ensurepip \
			$ensurepip --root=/ ; \
	fi
/bin/sh: line 1: 84288 Segmentation fault: 11  ./python.exe -E -m ensurepip $ensurepip --root=/
make: *** [install] Error 139

Если категорически нужна именно неподдерживаемая версия, можно поковырять следующие варианты решения:

  1. даунгрэйд gcc-12 до gcc-10 (не пробовал)
  2. brew install clang; CC=clang pyenv install ... (не помогло)
  3. gist
  4. github issue

Итог: установил python 3.7.13

  1. Переустановить CommandLine Tools
  2. Выполнить команды:
1
2
3
CFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix openssl)/include -I$(xcrun --show-sdk-path)/usr/include" \
LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix openssl)/lib" \
PYTHON_CONFIGURE_OPTS=--enable-unicode=ucs2 \
  1. Ставим через патч
1
pyenv install --patch 3.5.3 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch)

Источники:

PyEnv BUILD FAILED installing Python on MacOS Comment on Github