この記事では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
無事実行できました。