読者です 読者をやめる 読者になる 読者になる

Λlisue's blog

つれづれなるままに更新されないブログ

matplotlib を PyQt じゃなくて PySide で動かして PyQt 独特の面倒極まりないインストールから開放される

プログラミング HowTo Linux Python Programming matplotlib graph Documentation Science Config

f:id:lambdalisue:20140523170138p:plain

なんか pip install--no-install とか --no-download オプションが DEPRECATED になったり PyPI から PyQt4 がダウンロードできなくなったり、いろいろ変化してますね。有末です。

どうもこないだの記事を書くときに行った環境整理で間違えて matplotlib 消しちゃったようなのでインストールをしなおしていました。 matplotlib は皆さんもご存知の通り Python からグラフを描くためのライブラリで、 科学処理系で Python を使っている僕にはなくてはならないライブラリです。 こいつは描画関係に PyQt という Python から Qt を使うためのライブラリを要求するんですが(というか僕がそれを使いたいから要求してんだけど) PyQt は昔からインストールが割と面倒です。 なので前は OS のパッケージマネージャ版を使っていたのですがこんな記事も書いちゃったことですし pyenv に入れることにしました。 ところが冒頭にも書きましたが PyPI から PyQt4 ダウンロードできなくなってるし pip でライブラリをダウンロードするコマンドは整備中みたいだし(refactor --no-install/--no-download/--download (and use mkdtemp build dirs) #906)ってことで面倒くさくなったので PyQt の代わりに PySide を使うことにしました。

PySide

PySide は割と活発に開発されている PyQtAlternative ですが、 PyQtGPL (GNU General Public License) なのに対し PySide は LGPL (GNU Lesser General Public License) という大きなライセンスの違いがあります。 Qt を LGPL で使えるという嬉しい面の他にも、新規開発であるために内部構成が美しくなっている点やインストールが簡単な点などがあるので、個人的に Python から Qt を使う場合は大抵こちらを選んでいます(ただし一部機能については PyQt のほうが高機能で PySide がそれに追従する努力をしている段階です)。

Install & Configure

とりあえずインストールはほぼ何も考えなくても問題ありません。 一つ注意が必要なのは PySide のセットアップスクリプトでドキュメントをビルドする部分があるのですが、ビルドに Sphinx を使っています、が、install_require に指定されていないようなのでこれがないとコケます。なので Sphinx と PySide のインストール順番は気をつけましょう。 あ、あとちなみに numpy も matplotlib も pyside もいろんなライブラリを要求するので、怒られたら頑張ってインストールしましょう。

$ pip install numpy matplotlib sphinx
$ pip install pyside

とりあえず問題なくすべてインストールが終わったと仮定します。 で、このままだと matplotlib さんが PyQt を探しに言ってしまうので Linux~/.config/matplotlib/matplotlibrcMac~/.matplotlib/matplotlibrc に下記のように記載してください。

backend     : qt4agg
backend.qt4 : PySide

これで動くようになるはずです。 ちなみにこのファイルには他にも色々な設定ができるので、気になる人はCustomizing matplotlibをチェックしてください。 全てが終われば下記のテスト用プログラムが動くはずです。

import numpy as np
import matplotlib.pyplot as pl

x = np.linspace(-np.pi, np.pi, 201)
y = np.sin(x)

pl.plot(x, y)
pl.xlabel('Angle [rad]')
pl.ylabel('sin(x)')
pl.axis('tight')
pl.show()

Good luck!