1001001

73。CTFのWrite-upや技術的な備忘録を書きとめたいです。

【Mac/Python】homebrewでインストールしたPythonライブラリがpyenv環境で使えない時の対処法

chipwispererというツールをこのページを参考にインストールしようとしていて,homebrewでscipyを入れる手順があった.scipyのインストールには成功したが,Pythonでモジュールが見つからない.pyenv環境から上手いこと参照されてないのでは?と思ったらそうだったという内容です.

環境

現象

Homebrewでscipyを入れた.正しくインストールは完了したのに,いざPythonで使ってみようとするとImportError: No module named scipyみたいなことになる.

原因

Homebrewのインストール先にライブラリが置かれるのでpyenvのPythonから参照できないのが原因です.

Homebrewのインストール先

Homebrewで入れたPythonパッケージは,/usr/local/Cellar/配下に入る.これをpyenvのPythonが参照できてない.
例えばscipyをインストールした場合は,
/usr/local/Cellar/scipy/1.0.0_2/lib/python2.7/site-packages/scipyにPython2.7用のscipyが入っている.

pyenvのPythonはどこにある?(どうやってバージョン切り替えしている?)

pyenvをセットアップする時に意識するかもしれないが,pyenvは~/.pyenvの中に~/.pyenv/versions/というのを作って,さらにこの中に2.7.14とか3.6.3とかを作ってこれを切り替えている.
おそらくecho $PYENV_ROOTとかで確認できる (私の場合はPYENV_ROOTを変更している.そうするのが普通?).
そして,Python 2.7.14のsite-packegesディレクトリは,
$PYENV_ROOT/versions/2.7.14/lib/python2.7/site-packages/にある.

対処

いくつか対処法はありそうだが,ここではシンボリックリンクを貼る方法を紹介する.
以下のようにシンボリックリンクを貼ることで対処可能.

% ln -s /usr/local/Cellar/scipy/1.0.0_2/lib/python2.7/site-packages/scipy/ /usr/local/var/pyenv/versions/2.7.14/lib/python2.7/site-packages

感想

pipで入れられるなら極力pipで管理した方がシンボリックリンクとかpathの設定とかしなくて済むので良さそうな気がしますが,
今回はHomebrewでのインストールにおける対処を行いました.