YouTube

備忘録:macOS Big Sur – pyenvでPythonをインストールしようとしてハマった時の対処法

iOSアプリPythonista3は3.6.1と2.7.12がベースなのでMacBookProに古いPythonを導入しようとしたところ、MBP2015(クリーンインストール)では問題なかったのだがMBP2017(アップグレード)で開発環境を整えようと思ったらハマったため解決のためにやったことをまとめました。

インストール時に出たエラー

pyenvでpython3.6.1をインストールしようとすると下記のエラーがでて失敗しました。

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

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

Inspect or clean up the working tree at /var/folders/xx/d2c_grsx75x9b2k6ddzdzm400000gn/T/python-build.20210507224023.44752
Results logged to /var/folders/xx/d2c_grsx75x9b2k6ddzdzm400000gn/T/python-build.20210507224023.44752.log

Last 10 log lines:
./Modules/posixmodule.c:8146:15: error: implicit declaration of function 'sendfile' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        ret = sendfile(in, out, offset, &sbytes, &sf, flags);
              ^
./Modules/posixmodule.c:10340:5: warning: code will never be executed [-Wunreachable-code]
    Py_FatalError("abort() called from Python code didn't abort!");
    ^~~~~~~~~~~~~
clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include   -I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include   -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers   -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/jiro/.pyenv/versions/3.6.0/include  -I/usr/local/opt/readline/include -I/usr/local/opt/readline/include -I/usr/local/opt/openssl@1.1/include -I/Users/jiro/.pyenv/versions/3.6.0/include   -DPy_BUILD_CORE  -c ./Modules/_sre.c -o Modules/_sre.o
1 warning and 1 error generated.
make: *** [Modules/posixmodule.o] Error 1
make: *** Waiting for unfinished jobs....

対処法

Homebrew でパッケージをインストール
brew install zlib bzip2
環境変数を設定

上記の環境変数を下記コマンドで設定

export LDFLAGS="-L/usr/local/opt/bzip2/lib -L/usr/local/opt/zlib/lib"

export CPPFLAGS="-I/usr/local/opt/bzip2/include -I/usr/local/opt/zlib/include"
pyenv で Python をインストール

いつも通りPythonをpyenvでインストール

pyenv install 3.6.1

もし無理だったら下記コードを試してください。
※3.6.1を任意のバージョンに変えてください

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install --patch 3.6.1 < <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch\?full_index\=1)

3.7や3.8以降はこちら

LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib" pyenv install 3.x.x

備考

そもそもで各種設定ができていなかったり再インストールすることで解決する可能性もあるので、それぞれ記しておきます。

xcodeコマンドラインツールの再インストール

まずはXcode > Preference > Locations からそもそも設定できてるか確認。
下記コマンドでうまくインストールできないなら More Downloads for Apple Developers からダウンロードしてインストール。

sudo rm -rf /Library/Developer/CommandLineTools

xcode-select --install

#EULAの同意 - 読み飛ばしたらagreeと入力
xcode-select -license

pyenvの再インストール

brew uninstall pyenv
brew install pyenv

パスは下記

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
source ~/.zshrc

Homebrewの再インストール

アンインストール

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

インストール – Homebrewで確認

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

おわりに

原因そのものは色々と考えられるので、今回の対処法で必ずしも解決できるわけではありませんが、どなたかの助力になれば幸いです。

ちなみに、Big Surにしてネットがめちゃくちゃ遅くなったのでNVRAMリセットしたら治りました。
Macの電源を入れたら「Command」「P」「R」「Option」の4つのキーを20秒以上押し続けていつものジャーンって音聞こえたら離すだけです。