macOSでPython2.x系が必要になった場合の対処

この記事では[Cogbot勉強会！in 名古屋 ～Cogbotええがゃ！～ - connpass](https://cogbot.connpass.com/event/79249/)で筆者が直面した問題の対処方法について述べます。

Update
---------------------------------------

現在は下記の対応は不要で、基本的に特別なことをしなければ、`brew install python`でPython 3.x系統をインストールしても`python`コマンドでは2.x系が呼び出されるようになっているはずです。

詳しくは次の記事をご参照ください。

[Homebrewでインストールされる/usr/local/bin/pythonが再びPython2に変更](https://rcmdnk.com/blog/2018/03/10/computer-mac-homebrew-python/)

TL;DR
---------------------------------------

* [Homebrew](https://brew.sh/index_ja)でpython3系をインストールしていると`node-gyp`で困ることがある
* `virtualenv`でpython2系の仮想環境を作ることでpythonの2系と3系が切り替えられる
* 2系の仮想環境を作って利用することで回避可能

発生した問題
---------------------------------------

久しぶりに`node`の開発環境を作って`npm install`しようとしたところ次のエラーが発生しました。

```ruby:qiita.rb
> node-gyp rebuild || node suppress-error.js

gyp ERR! configure error
gyp ERR! stack Error: Python executable "/usr/local/bin/python" is v3.6.4, which is not supported by gyp.
gyp ERR! stack You can pass the --python switch to point to Python >= v2.5.0 & < 3.0.0.
```

エラーの原因は2つあります。

1つ目の原因はHomebrewでのpythonパッケージが3.x系を指すようになったことです。経緯については[HomebrewでインストールされるPython(2)の変更について](https://rcmdnk.com/blog/2017/07/28/computer-mac-homebrew/)に詳しく記載されています。現在、`brew install python`とすると`python`でPython3.x系が呼び出されるようになります。これは`brew info python`で確認できます。

```
$ brew info python
python: stable 3.6.4 (bottled), devel 3.7.0b2, HEAD
Interpreted, interactive, object-oriented programming language
https://www.python.org/
(中略)
==> Caveats
Unversioned symlinks `python`, `python-config`, `pip` etc. pointing to
`python3`, `python3-config`, `pip3` etc., respectively, have been installed into
  /usr/local/bin

If you need Homebrew's Python 2.7 run
  brew install python@2

If you wish to have python@2's python and python2 executables in your PATH then
add the following to ~/.bash_profile:
  export PATH="/usr/local/opt/python@2/libexec/bin:/usr/local/opt/python@2/bin:$PATH"

Pip, setuptools, and wheel have been installed. To update them run
  pip3 install --upgrade pip setuptools wheel

You can install Python packages with
  pip3 install <package>
They will install into the site-package directory
  /usr/local/lib/python3.6/site-packages

See: https://docs.brew.sh/Homebrew-and-Python
```

2つ目の原因は[`nodejs/node-gyp`](https://github.com/nodejs/node-gyp)がpython3系に対応していないことです。

> python (v2.7 recommended, v3.x.x is not supported)

根本的な解決は[`node-gyp`](https://github.com/nodejs/node-gyp)をpython3系に対応させることですが、ここでは回避策として`python`コマンドで呼び出すPythonのバージョンを切り替えることにします。

Pythonのバージョンの切替方法
---------------------------------------

Pythonのバージョンの切替を実現する手段は、例えば次のようなものがあります。

1. `pyenv`の導入
2. Anacondaの利用
3. `virtualenv`と`venv`の利用

今回は`virtualenv`を利用して解決してみます。

### Python2系のインストール

必須ではありませんが、Python2系のインストールを行います。これによりPython2系の`pip`が`pip2`コマンドで呼び出せるようになります。

```bash
$ brew install python@2
```

また、`.bash_profile`に次の内容を追記しておきます。

```.bash_profile
export PATH="/usr/local/opt/python@2/bin:$PATH"
```

インストールがうまくいっていれば、`python2`でPython2が呼び出されるようになっているはずです。

```bash
$ python2 -V 
Python 2.7.14
```

### `virtualenv`のインストール

`pip2`を使って`virtualenv`をインストールします。

```bash
$ pip2 install virtualenv
```

### python2用の仮想環境の作成

`virtualenv`を使ってpython2用の仮想環境を作成します。

```bash
$ cd to/your/working/directory
$ python2 -m virtualenv python2
```

上記コマンドのうち、`python2`は任意の名前に置き換えて大丈夫です。上記コマンドを実行すると`python2`ディレクトリ(実際は任意の名前で大丈夫)ができあがります。

### 作成したpython2環境の利用

完了後、作成した環境をアクティベートします。

```
$ source python2/bin/activate
```

これにより`python`コマンドでPython2系が呼び出されるようになります。

```
$ python -V
Python 2.7.14
```

### 作成したpython2環境からの離脱

離脱には`deactivate`コマンドを利用します。

```
$ deactivate
```

### 作成した環境の削除

作成した環境を削除するためには、作成されたディレクトリを削除すれば大丈夫です。

結果確認
---------------------------------------

もともとは`npm install`がしたかったのでした。結果を確認してみます。

```
$ npm install --save botbuilder restify dotenv
+ dotenv@5.0.1
+ botbuilder@3.14.0
+ restify@6.3.4
updated 3 packages in 7.469s
```

無事実行できました。

Reference
---------------------------------------

### Node.js

* [MacにNode.jsをインストール - Qiita](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)

* [ブラウザで実行するjsの開発環境構築(主にReact.js) - Qiita](https://qiita.com/_ha1f/items/af2cb29983456a8c8576)

* [フロントエンド開発の３ステップ（npmことはじめ） - Qiita](https://qiita.com/hashrock/items/15f4a4961183cfbb2658)

* [npmで入る便利ツールまとめ](https://gist.github.com/hashrock/7fdf1b937e1eb5de796d)

* [nodejs/node-gyp: Node.js native addon build tool](https://github.com/nodejs/node-gyp)

### BotFramework

* [Microsoft Bot Framework](https://dev.botframework.com/)

* [help-desk-bot-lab-ja/exercise0-preparation.md (セットアップ)](https://github.com/satonaoki/help-desk-bot-lab-ja/blob/master/Node/exercise0-preparation.md)

### Homebrew

* [HomebrewでインストールされるPython(2)の変更について](https://rcmdnk.com/blog/2017/07/28/computer-mac-homebrew/)

### Pyenv, venv, virtualenv

* [Pythonの仮想環境構築(2017年版) pyenvとpyenv-virtualenvとvirtualenvとvirtualenvwrapperとpyvenvとvenv - Qiita](https://qiita.com/maskedw/items/aaa2fd7abfd493cf2820)

* [複数バージョンのPython2系と3系をvenv(virtualenv)で切り替えて使用する環境構築まとめ(windows編) | ぱーくん plus idea](https://web.plus-idea.net/2017/02/python2-3-venv-virtualenv/)

* [virtualenv 基本的なコマンド使い方メモ - Qiita](https://qiita.com/th1209/items/84f21a4499548b34ec91)