npmでとあるモジュールをインストールしようとしたところ、以下のエラーが。
Error: Python executable is v3.6.0, which is not supported by gyp.
とりあえず、「gypはPython3.6.0には対応してないからどうにかしろよ」ってことっぽいですが、なぜnode、というかnpmを使っているのにPythonのエラーが!?
ということで、意味がわからなかったのですが、いろいろ調べて解決したのでメモしておきます。
もくじ
まず、gypってなんぞ?
gypとは”Generate Your Projects”の略で、いろんなプラットフォームに対応したビルド設定ファイルを生成してくれるビルドツールのことだそうです。
gyp はマルチプラットフォーム対応のメタビルドシステムです。CMake、scons、waf などを使い倒した Google の人たちがそれらを運用する上での問題を回避するために開発されているようです。基本的にはネイティブコードをビルドするためのシステムのようです。
gyp は Python で実装されていて、Python 2.7 で動作します。古い Cent OS など Python 2.4 が既定の環境では Python 2.7 を用意する必要があります。
gyp – Qiita (http://qiita.com/izariuo440/items/c9de0a3739e67548f41a)
まーなんのこっちゃって感じですが、
- nodeのモジュールによってはビルドのためにこのgypが使われてるものがある
- そのgyp自体は、nodeとかじゃなくてPython2で書かれている
- そのため、Python2系を用意してやらんと動かん
というわけで、Pythonが入っていなかったり、僕みたいにPython3系を使っている環境だとnpm installに失敗する。という話のようです。
解決策:Pythonのバージョンを2.7系に切り替えればok
じゃあどうすりゃいいのかというと、gypがちゃんと動くようにPython2系の実行環境を用意してやればOKです。
ただ、普段のnode以外のプロジェクトでPythonを書くときは、100%Pyhon3系を使うので、グローバルなPythonのバージョンそのものを2系に落とすのは抵抗があります。
そのため、Pythonのバージョンマネージャーであるpyenvを使って、プロジェクトごとにPythonのバージョンを切り替えて使うことにします。
手順:Python2系の実行環境を用意する
pyenvのインストール
まずはホームディレクトリ(~)に、pyenvをGitからクローンしてきましょう。
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
$ pyenv -v
のコマンドで、以下のようにpyenvのバージョンが表示されれば、無事にインストール成功です。
pyenv 1.1.0
.bash_profileに追記してpyenvにパスを通す
次に、bashの設定ファイルに以下を記述して、pyenvへのパスを通しておきます。
export PYENV_ROOT=”$HOME/.pyenv”
export PATH=”$PYENV_ROOT/bin:$PATH”
eval “$(pyenv init -)”
シェルを再起動する
.bash_profileへの追記ができたら、忘れずにシェルを再起動しておきましょう。
シェルを再起動したら、pyenvが使えるようになっているはずです。
pyenvでpython2.7をインストール
では、いよいよgypのためにPython2系をインストールします。
以下のように、installコマンドに続いてバージョンを指定することができます。
ここではPython2.7.9を使用。
$ pyenv install 2.7.9
pyenvを使ってローカルで使用するPythonのバージョンを2.7.9に指定
はじめにも書きましたが、普段は基本的にPython3系を使いたいので、このプロジェクトのみでPython2.7.9を使うように設定します。
なので、以下のようにpyenvコマンドにlocalを指定して実行すれば、このプロジェクト内で使うPythonのみを2.7.9にすることができます。
$ pyenv local 2.7.9
Pythonのバージョンがちゃんと切り替わっているか、python -Vコマンドで確認してみましょう。
以下のように、2.7.9が表示されればOKです。
Python 2.7.9
ちなみに、上記のプロジェクトがあるディレクトリ以外でPythonのバージョンを確認したところ、ちゃんと3系のままになっています。
Python 3.6.0 :: Anaconda 4.3.1 (x86_64)
再度npm install
Python2系の用意ができたら、再度目的のモジュールをnpm installしてみましょう。
これまでの手順ができていれば、gypのエラーが表示されずにinstallが成功するはずです。
感想とか
今までなんとなーく使っていたnpmコマンドですが、モジュールによっては内部でPython使ってたりするなんて全く知りませんでした。
なので、npmのエラーで”Python”の文字を見たときには意味がわからなくて焦りましたが、理由さえわかってしまえば納得ですね。
普段は「とりあえずつかえりゃいいや、動けばOK」の精神でいろいろ開発してるので、たまにはちゃんと勉強してみるのも楽しいものでした。
参考にしたサイト
gyp – Qiita
http://qiita.com/izariuo440/items/c9de0a3739e67548f41a
node-gypを使ったネイティブモジュールの作成 – SlideShare
https://www.slideshare.net/shigeki_ohtsu/nodegakuen5-ohtsu
node-gypコンパイル時に怒られるときは素直にpythonを2.7系におとす
http://shuzo-kino.hateblo.jp/entry/2015/06/15/234057
pyenvを使ってMacにPythonの環境を構築する – Qiita
http://qiita.com/1000ch/items/93841f76ea52551b6a97