はじめに
様々なバージョンで動作を検証したい場合、複数のバージョンをインストールしておき切り替えて動作確認をしたいケースが存在します。
今回は、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未満の場合の対処法は今後、いろいろ時間があるときにチャレンジしてみようと思います。
是非試してみてください。