Big Surで "macOS 11 or later required !" が出たり、pyarrow2.0.0 がinstallできなかったりしたときの対処メモ

はじめに
=======

定期的にやってくる環境周りのトラブルですが、今回は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 !` への対処

### 再現方法
こんな感じです。

```shell-session
% 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 を入れている場合は以下のような感じになります。

```shell-session
% 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
```

さいごに
=======

ビルドエラーとか人類の時間を奪う敵だと思います。