Edited at

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

More than 1 year has passed since last update.

この記事では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しようとしたところ次のエラーが発生しました。


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)の変更についてに詳しく記載されています。現在、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のバージョンの切替を実現する手段は、例えば次のようなものがあります。



  1. pyenvの導入

  2. Anacondaの利用


  3. virtualenvvenvの利用

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


Python2系のインストール

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

$ 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

無事実行できました。


Reference


Node.js


BotFramework


Homebrew


Pyenv, venv, virtualenv