この記事ではCogbot勉強会!in 名古屋 ~Cogbotええがゃ!~ - connpassで筆者が直面した問題の対処方法について述べます。
Update
現在は下記の対応は不要で、基本的に特別なことをしなければ、brew install pythonでPython 3.x系統をインストールしてもpythonコマンドでは2.x系が呼び出されるようになっているはずです。
詳しくは次の記事をご参照ください。
Homebrewでインストールされる/usr/local/bin/pythonが再びPython2に変更
TL;DR
-
Homebrewでpython3系をインストールしていると
node-gypで困ることがある -
virtualenvでpython2系の仮想環境を作ることでpythonの2系と3系が切り替えられる - 2系の仮想環境を作って利用することで回避可能
発生した問題
久しぶりにnodeの開発環境を作ってnpm installしようとしたところ次のエラーが発生しました。
> 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)の変更についてに詳しく記載されています。現在、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がpython3系に対応していないことです。
python (v2.7 recommended, v3.x.x is not supported)
根本的な解決はnode-gypをpython3系に対応させることですが、ここでは回避策としてpythonコマンドで呼び出すPythonのバージョンを切り替えることにします。
Pythonのバージョンの切替方法
Pythonのバージョンの切替を実現する手段は、例えば次のようなものがあります。
-
pyenvの導入 - Anacondaの利用
-
virtualenvとvenvの利用
今回はvirtualenvを利用して解決してみます。
Python2系のインストール
必須ではありませんが、Python2系のインストールを行います。これによりPython2系のpipがpip2コマンドで呼び出せるようになります。
$ brew install python@2
また、.bash_profileに次の内容を追記しておきます。
export PATH="/usr/local/opt/python@2/bin:$PATH"
インストールがうまくいっていれば、python2でPython2が呼び出されるようになっているはずです。
$ python2 -V
Python 2.7.14
virtualenvのインストール
pip2を使ってvirtualenvをインストールします。
$ pip2 install virtualenv
python2用の仮想環境の作成
virtualenvを使ってpython2用の仮想環境を作成します。
$ 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
無事実行できました。