[Python] pyenvを利用して古いpythonのバージョンをインストールした際、エラーが発生しインストールができない現象の解決策

はじめに

様々なバージョンで動作を検証したい場合、複数のバージョンをインストールしておき切り替えて動作確認をしたいケースが存在します。

今回は、pyenvにてpythonをインストールしている方向けに、古いバージョンをインストールしようとした際にエラーが発生する件の解消方法を備忘録として残しておきます。

実行した環境

今回実行した環境はMac OSとなります

実行環境OS X 13.5.2 (macOS Ventura)
pyenv バージョン2.3.26
インストール予定バージョン3.5.9

古い環境のpythonを実行して検証するので、3.5系の最新をインストールします

発生したエラー

今回発生したのは、3.5系のpythonをインストールしようとした際に発生しました。

他の記事とかも見てみると3.7以上では普通にインストールできたが、3.6以下のバージョンがインストールできないケースが多いようです。

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

BUILD FAILED (OS X 13.5.2 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/vv/4f5fgl7j0356jbgx6k5zd_hw0000gn/T/python-build.20230921090141.21530
Results logged to /var/folders/vv/4f5fgl7j0356jbgx6k5zd_hw0000gn/T/python-build.20230921090141.21530.log

Last 10 log lines:
./Modules/posixmodule.c:8394:15: error: call to undeclared function 'sendfile'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
        ret = sendfile(in, out, offset, &sbytes, &sf, flags);
              ^
1 warning generated.
8 warnings and 1 error generated.
clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include  -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include  -Werror=declaration-after-statement   -I. -I./Include -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/opt/openssl@1.1/include  -I/Users/xxxxx/.pyenv/versions/3.5.9/include -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/opt/openssl@1.1/include  -I/Users/xxxxx/.pyenv/versions/3.5.9/include  -DPy_BUILD_CORE  -c ./Modules/_weakref.c -o Modules/_weakref.o
make: *** [Modules/posixmodule.o] Error 1
make: *** Waiting for unfinished jobs....
1 warning generated.
1 warning generated.

こんなエラーですね。

同じような方々が、いるようです。

Unable to build Python on macOS Big Sur with Xcode 12 beta · Issue #1643 · pyenv/pyenv
IinstalledmacOSBigSurbeta1,Xcode12.0beta(12A6159)onanoldMactoseewhatbreaks.I'mabletoinstallPyEnvviaHomebrew,butI'mnotabletobuildanyPythonversion.Appleclangversi...

解決策

こちらのサイトで解決策が提示されていましたので、実行してみます。

【macOS Big Sur】pyenv経由で古いpythonをインストールする - Qiita
#概要macOSBigSur上で、pyenvで古いpython(今回は3.7以下)のインストールに失敗したので、解決のためにやったことをまとめました。日本語では、3.7以下の古いバージョンの…
$ LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.5.9 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.5.9.tar.xz...
-> https://www.python.org/ftp/python/3.5.9/Python-3.5.9.tar.xz
Installing Python-3.5.9...
patching file 'Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst'
patching file configure
patching file configure.ac
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.5.9 to /Users/hirokazu/.pyenv/versions/3.5.9

無事インストールできました。
pyenvでも確認してみます。

$ pyenv versions                                                                                                                                                                     
  system
  3.5.9
  3.10.9
* 3.11.5 (set by /Users/xxxxxx/.pyenv/version)

問題なさそうですね。
無事、古いバージョンのインストールもできました。

3.5系未満をインストールする

今回の解決策を利用して3.3系や3.4系をインストールしようとすると下記エラーが発生します。

$ LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.4.9 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.4.9.tar.xz...
-> https://www.python.org/ftp/python/3.4.9/Python-3.4.9.tar.xz
Installing Python-3.4.9...
patching file 'Misc/NEWS.d/next/macOS/2020-06-24-13-51-57.bpo-41100.mcHdc5.rst'
patching file configure
patching file configure.ac
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 13.5.2 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/vv/4f5fgl7j0356jbgx6k5zd_hw0000gn/T/python-build.20230921091119.48934
Results logged to /var/folders/vv/4f5fgl7j0356jbgx6k5zd_hw0000gn/T/python-build.20230921091119.48934.log

Last 10 log lines:
Python/random.c:98:19: error: call to undeclared function 'getentropy'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
            res = getentropy(buffer, len);
                  ^
2 errors generated.
make: *** [Python/random.o] Error 1
make: *** Waiting for unfinished jobs....
1 warning generated.
1 warning generated.
1 warning generated.
1 warning generated.

ということは、他の解決策が必要ということですかね。

基本的に下記のgithubにあるように、3.4.x系でははpatchを適用した状態でインストールする必要があります。

上記から「python-3.4.3-macos.patch」をダウンロードして、下記のコマンドを実行します。

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install 3.4.3 --patch < python-3.4.3-macos.patch

こちらで解決できないケースもあるみたいですが、実施してみる価値はあるかと思います。

最後に

3.5未満の場合の対処法は今後、いろいろ時間があるときにチャレンジしてみようと思います。
是非試してみてください。

タイトルとURLをコピーしました