はじめに
定期的にやってくる環境周りのトラブルですが、今回はMacのOSを Big Sur にUpgradeしたことに起因したものでした。
困ったことの要約
- Big Sur で pyenv で python を使っていたら
macOS 11 or later required !
という謎のエラーが出て pythonがcrashした - 上記はpython3.9.1 にすると解消するのだが、すると
pyarrow
が対応していなくて Installできない - grpcio が Installできない
- numpy 周りでエラーになる!
ということが発生したので、そのworkaroundを書いておきます。
いずれ不要になるとは思いますが、今現在で言えば結構厄介です。
個々の対処法
macOS 11 or later required !
への対処
再現方法
こんな感じです。
% python -c "import tkinter; r = tkinter.Tk()"
macOS 11 or later required !
zsh: abort python -c "import tkinter; r = tkinter.Tk()"
Tkなんて使わないよ! と思うでしょうが、 matplotlib か何かが使おうとしたりします。
※ んーそれを回避した方が良かったかもしれないな...
対処法
(たぶん BigSurにしてから)pyenv経由でInstallしたようなPythonで発生していたようですが、 pythonを3.9.1にすることで解消されました。brew で pyenv を入れている場合は以下のような感じになります。
% brew install tcl-tk # これが必要なのか、は未確認ですがそう書いてあるところがあった
% brew upgrade pyenv
% pyenv install -l | grep 3.9 # 3.9系を探す
3.9.0
3.9-dev
3.9.1
miniconda-3.9.1
miniconda3-3.9.1
% pyenv install 3.9.1 # 3.9.1 が一番新しいのでそれにする
治るか確認
% pyenv local 3.8.7 # エラーが出るVersion
% python -c "import tkinter; r = tkinter.Tk()"
macOS 11 or later required !
zsh: abort python -c "import tkinter; r = tkinter.Tk()"
% pyenv local 3.9.1
% python -c "import tkinter; r = tkinter.Tk()"
### エラーが出ない! ###
python3.9系になんてできないときは...?
とは言っても、気軽に3.9系にUpdateできるプロジェクトばかりではないでしょうし、その場合は正規のInstaller経由でInstallしたPythonなら大丈夫だとかなんだとか(未確認)。
pyarrow2.0.0 が python3.9 に対応していない!
pyarrow は どうも pyathena
の pandas
拡張 のようなライブラリから必要とされているようで、それらを使っていると影響を受けます。
普通に pip や poetry などではInstallできなかったので、3.8系のwheelを強引にInstallします(たぶんちゃんと動いている)。cp38
な部分を cp39
にするとどうも良いらしい。酷い方法ですが、仕方ない...
% curl -LO https://files.pythonhosted.org/packages/14/75/9f116c8d0774ed170c59c87649d3e74dbdaf3318d72a09171c6f4634c7a7/pyarrow-2.0.0-cp38-cp38-macosx_10_13_x86_64.whl
% mv pyarrow-2.0.0-cp38-cp38-macosx_10_13_x86_64.whl pyarrow-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl
% pip install pyarrow-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl
これで、poetry や pipenv などで Installしようとしても既にInstall済みなので何もされずエラーにならなくなります。
grpcio が Installできない
BigSur周りのトラブルの初期に出くわしたので、どういう発生条件か忘れてしまいましたが、これも事前に以下のようにして入れておくと良かったです。
% pip install --upgrade pip setuptools wheel
% pip install --no-cache-dir --force-reinstall -Iv grpcio==1.34.0
numpy 周りでエラーになる!
どうも Accelerator がどうとか、そういう理由でエラーになるようでした。
Install時ではなく、実行時にエラーになるのでちょっと性質が悪いです。
こんな感じでInstallしておくことで、回避できました。
% brew install openblas
% OPENBLAS="$(brew --prefix openblas)" pip install numpy
まとめると
最近は poetry で 管理していますが、結局こんな手順でInstallしておくとなんとか通りました。
% pyenv local 3.9.1
% poetry run pip install --upgrade pip setuptools wheel
% poetry run pip install --no-cache-dir --force-reinstall -Iv grpcio==1.34.0
% curl -LO https://files.pythonhosted.org/packages/14/75/9f116c8d0774ed170c59c87649d3e74dbdaf3318d72a09171c6f4634c7a7/pyarrow-2.0.0-cp38-cp38-macosx_10_13_x86_64.whl
% mv pyarrow-2.0.0-cp38-cp38-macosx_10_13_x86_64.whl pyarrow-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl
% poetry run pip install pyarrow-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl
% OPENBLAS="$(brew --prefix openblas)" poetry install
さいごに
ビルドエラーとか人類の時間を奪う敵だと思います。