Python

virtualenv環境でPILとmatplotlibをインストールしようとしたら盛大にドハマりした件

More than 5 years have passed since last update.

「はじめてのパターン認識」読書会がそろそろ終わりそうなので、次のシリーズなに読むかの話題で『実践コンピュータビジョン』が出てきました。

丁度家に死蔵されているので、引っ張り出してちょっと読んでみようと思ったのですが、環境作るところでドハマりしてしまいました。しかも割とどうでもいい理由で。情けない、、、

同じ轍を踏む人が現れないよう、メモっておきます。


環境


  • Ubuntu 12.04

  • Pythonはvirtualenvを使用


PILをインストールする前に

なんにも考えずにpip install PILすればインストールできるんですが、jpegファイルを読み込んでpylabでshowしようとすると下記のエラーを吐きやがります。

IOError: decoder jpeg not available

jpegのデコーダーがないよ、って言われたのでググってみると、libjpeg-devをインストールする必要があるらしいです。

ところがsudo apt-get install libjpeg-devすると、「もうあるよーーー!」って怒られました。

aptでlibjpeg-devをインストールすると、/usr/lib/x86_64-linux-gnu/配下にlibjpeg.soが作られるんですが、pipでPILをインストールするときにこのフォルダを見てくれないらしいです。

なので、pipから見える場所にシンボリックリンクを貼りましょう。

sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/libjpeg.so

リンク張った後でPILインストールしなおしたらちゃんと動作してくれました。


参考

http://atasatamatara.hatenablog.jp/entry/20120723/1343044059


matplotlibをインストールする前に

matplotlibもpipで入ります。依存性の関係でnumpyも入ります。

ところが、pylab.show()しても何も表示されない。エラーすら出てこない。なんだこりゃ???

調べたところ、画面表示のためのbackendを適切に設定するらしいです。どこで設定してるかというと、matplotlibrcというファイルがあります。下記コマンドで場所教えてくれます。

>>> import matplotlib

>>> matplotlib.matplotlib_fname()


matplotlibrc

backend      : agg


aggっていうbackendだと、ファイルへの書き込みはできるけどウィンドウ開いて画面に表示とかはできないらしいです。

実はシステムワイドのpythonにもmatplotlib入れちゃってるんですが、そっちのmatplotlibrcを見るとbackendはTkaggになってました。Tkinterを使ってるみたい。

なのでaggからTkaggに書き換えてみます。すると今度は下記のエラーが出るようになりました。

No module named _tkagg

matplotlibをコンパイルするときに_tkagg.pyというファイルが生成されてないみたいです。これを解消するには、tk-devをインストールする必要があります。

sudo apt-get install tk-dev

今度は/usr/lib配下に入るのでリンク貼る必要はないです。tk-devを入れた後でmatplotlibをインストールし直せばおk


まとめ

私が手探りで色々試した順番で書いてしまってますが、本来はこんな流れでセットアップするべきでしょう。

sudo apt-get install libjpeg tk-dev

sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/libjpeg.so

pip install PIL
pip install matplotlib

vim /path/to/your/matplotlibrc
### backendをTkappに書き換える

ちなみに、ググれば情報はそれなりに出てくるんですが、「システムワイドのmatplotlibだとtkでちゃんと表示されるんだからtk-devが入ってないわけがない」って決めつけて確認しなかったせいでドハマりしてしまいました。

経緯は覚えてないですが、たぶんシステムワイドに入れた時にはaptで、バイナリで入れたからtk-devがなくても_tkaggが入ってたんでしょうね、、、