【node.js】npmでなぜかPythonエラーが!?”Python executable is v3.6.0, which is not supported by gyp.”の解決方法

スポンサーリンク

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 -v
pyenv 1.1.0

.bash_profileに追記してpyenvにパスを通す

次に、bashの設定ファイルに以下を記述して、pyenvへのパスを通しておきます。

# Setting PATH for 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 -V
Python 2.7.9

ちなみに、上記のプロジェクトがあるディレクトリ以外でPythonのバージョンを確認したところ、ちゃんと3系のままになっています。

$ python -V
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

ABOUTこの記事をかいた人

職業:遊び人。1日の半分は睡眠時間の超ロングスリーパー。元大手IT企業のサラリーマンだったが、ブラックな労働環境で体を壊した挙句クビになり、やむをえず独立。それ以来定職にもつかず、半分遊びのようなヌルい仕事をしながら適当に暮らしている。良く言えばノマドワーカー。 詳しいプロフィールはこちら