MacでXcodeと一緒にpython3をインストールする

## はじめに

macOSにはpython2.7が標準でバンドルされていますが、python3系は入っていません。python2系は既にサポートが終了していますので、python3系に切り替えている方が多いのではないかと思います。私もディープラーニングのコードを動かす時（勉強用に人様が作ったコードを動かしてみるのがメインですが・・）にpythonを使いますが、最近はいつもpython3を使っています。

macOSにpython3がついてこないので、これまでは；

- anaconda → 最近は使っていない
- pyenv → 最近はこっち

を使ってpython3をインストールしていました。今回iMacを2020（最後のIntel版）に更新して環境構築を行なっていた際に、Xcode Command Line Toolsをインストールするとpython3が同時にインストールされることに気がつきました。この情報、ネットを調べてもあまり見かけませんが、Xcodeをインストールする方はついでにpython3も手に入れることができるため、案外お手軽な方法かもしれないと思いこの記事でご紹介します。

ただし、Xcodeのバージョンによってついてくるpython3のバージョンが決まっているたため、pythonのバージョンを決め打ちにしたい方には向いてないですが・・

## 検証環境

- macOS Catalina 10.15.6  → 現在はBigSur 11.2.3にアップデートしています
- Xcode 11.6　→ 現在は12.4にアップデート
- OS標準のpython2.7以外は入っていない状態からスタート

## 手順

#### pythonのバージョンを確認

``` 
$ python --version
Python 2.7.16

$ python3 --version
xcrun: error: active developer path ("/Library/Developer/CommandLineTools") does not exist
Use `sudo xcode-select --switch path/to/Xcode.app` to specify the Xcode that you wish to use for command line developer tools, or use `xcode-select --install` to install the standalone command line developer tools.
See `man xcode-select` for more details.
```

Xcode command line toolsのインストール（xcode-select --install）でpython3が使えると言っているではありませんか！ 早速インストール。

#### Command Line Toolsのインストール

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

![start-install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162338/b40dc39c-dd4a-545e-cda6-e2ee87482bbe.png)

Xcode本体（6GBくらいありでかい）をインストールしていなくてもcommand line tools単体でインストールすることもできます。この時点ではCatalinaに対応したXcode 11.6のcommand line toolsがインストールされますが、インストール中にアップデートがあるよと通知が出ていました。とりあえず最後までインストールします。

![update-notification.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162338/41faf9b3-8008-214d-a8ab-6c6b80e0d195.png)

#### インストール後の確認

```
$ python3 --version
Python 3.7.3

$ pip3 --version
pip 19.0.3 from /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/site-packages/pip (python 3.7)

pip3 list
Package    Version
---------- -------
pip        19.0.3 
setuptools 40.8.0 
six        1.12.0 
wheel      0.33.1 
```

python 3.7.3とpipがインストールされてました！
デフォルトで入っているモジュールは/Libray配下のシステム領域にインストールされています。

```
$ pip3 show six
Name: six
Version: 1.12.0
Summary: Python 2 and 3 compatibility utilities
Home-page: https://github.com/benjaminp/six
Author: Benjamin Peterson
Author-email: benjamin@python.org
License: MIT
Location: /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/site-packages
Requires: 
Required-by: 
```

試しにnumpyをインストールしてみます。--userオプションをつけてユーザディレクトリ配下にインストールするようにします。

```
~$ pip3 install --user numpy
Collecting numpy
  Using cached https://files.pythonhosted.org/packages/ad/0b/c8b1383f0c43eabf925172ce850bf2224ede9fc351e8acf0ddd66ff567ff/numpy-1.19.1-cp37-cp37m-macosx_10_9_x86_64.whl
Installing collected packages: numpy
  The scripts f2py, f2py3 and f2py3.7 are installed in '/Users/kenshi/Library/Python/3.7/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed numpy-1.19.1

$ pip3 list
Package    Version
---------- -------
numpy      1.19.1 
pip        19.0.3 
setuptools 40.8.0 
six        1.12.0 
wheel      0.33.1
```

PATHが通っていないという警告が出ていますがnumpyのインストールができました。
インストールされたパスは以下の通りでユーザのLibrabyフォルダ配下でした（~/.xxxの隠しフォルダに入れられるより、こっちの方が好きです）。

```
$ pip3 show numpy
Name: numpy
Version: 1.19.1
Summary: NumPy is the fundamental package for array computing with Python.
Home-page: https://www.numpy.org
Author: Travis E. Oliphant et al.
Author-email: None
License: BSD
Location: /Users/kenshi/Library/Python/3.7/lib/python/site-packages
Requires: 
Required-by
```

#### Command Line Toolsをアップデートすると

![start-update.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162338/81a98056-cb50-f562-6b7b-87f46e348f74.png)

このアップデートでCommand Line Tools for Xcode 12 beta 5がインストールされるようです。（Xcode本体は更新されませんでした）

アップデート完了後にpythonのバージョンを確認すると3.8.2になっていました・・
pipでインストールしたモジュールは、python3.8のパッケージとして引き継がれています。

```
$ python3 --version
Python 3.8.2

$ pip3 --version
pip 19.2.3 from /Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/site-packages/pip (python 3.8)

$ pip3 list
Package    Version
---------- -------
numpy      1.19.1 
pip        19.2.3 
setuptools 41.2.0 
six        1.15.0 
wheel      0.33.1

$ pip3 show numpy
Name: numpy
Version: 1.19.1
Summary: NumPy is the fundamental package for array computing with Python.
Home-page: https://www.numpy.org
Author: Travis E. Oliphant et al.
Author-email: None
License: BSD
Location: /Users/kenshi/Library/Python/3.8/lib/python/site-packages
Requires: 
Required-by: 
```

#### その他

ここまではpipは動かない（pip3で起動する必要がある）のですが、pip3をアップデートするとpipコマンドでも動くようになりました。

```
$ pip --version
zsh: command not found: pip

$ sudo pip3 install -U pip

$ pip3 --version
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
pip 20.2.2 from /Library/Python/3.8/site-packages/pip (python 3.8)

$ pip --version
pip 20.2.2 from /Library/Python/3.8/site-packages/pip (python 3.8)

$ pip list
Package    Version
---------- -------
numpy      1.19.1
pip        20.2.2
setuptools 41.2.0
six        1.15.0
wheel      0.33.1
```

pip3 --versionの実行時にワーニングが出ていますが、一旦ターミナルを終了して再度動かしすとこのワーニングは出なくなりました。

## その後

現在はmacOS BigSur(11.2.3）のpython 3.8.2で動いていいます。
ただ、macOSのバージョンアップが入ると、マイナーバージョンアップでもpipが動かなくなったりすることがあり正直微妙な感じです。

pipが動かなくなった際の対処Tips
1) No module named 'pip._internal.cli.main' が発生する
・python3が動く場合、pyhton3 -m pipで起動してみる。
・起動できる場合、sudo python3 -m pip install -U pip で復活する

## おわりに

ということで、Xcodeのアップデートで勝手にpython3.8に更新されるところは微妙な結果ですが、python3のインストールはこれまでより簡単にできました。

私がMacで使っている範囲ではpython3.8だと動かないソフトはないため（あとpythonを動かすのはLinuxマシンがメインですし）、しばらくこれでやってみようと思っています。