Pythonbrew環境下にPySideをインストールしようとしたらはまった

はじめに

PySideとはGUIライブラリであるQtのpythonバインディングです。兄弟にPyQtというのがいて、PyQtの技術要件にノキアが納得できなくなったからPySideを開発したとかなんとかいろいろ経緯があるようですけど、基本的に似たようなものとおもっていいと思います。PySideのほうがライセンスがゆるいです。(PyQtGPL、PySideはLGPL)

そういえば今年のPyCon JPでは PyQtではじめるGUIプログラミング なんてのがあるらしいですね。PyCon行きたかった…。

あと、PySideとPyQtの違いについてはこちら。
PySideとPyQtの差異 - None is None is None

さて、ただUbuntuにPySideをインストールするだけなら

sudo apt-get python-pyside

とするだけ。が、システム環境内のsite-packagesに入れたくないからPythonbrew使ってるわけなので、この方法は個人的に求めてる方法ではありません。--no-site-packagesオプション付きのvirtualenv環境も同様だと思います。なんせpipだと入らないっぽいので。

pip install PySideだと失敗する

pip install PySideだと「setup.pyがねえよ」って言われる。

$ pip install PySide
Downloading/unpacking PySide
  Downloading pyside-0.1.4.5.tar.bz2 (620Kb): 620Kb downloaded
  Running setup.py egg_info for package PySide
    Traceback (most recent call last):
      File "<string>", line 14, in <module>
    IOError: [Errno 2] No such file or directory: '/home/kk6/build/PySide/setup.py'
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):

  File "<string>", line 14, in <module>

IOError: [Errno 2] No such file or directory: '/home/kk6/build/PySide/setup.py'

----------------------------------------
Command python setup.py egg_info failed with error code 1
Storing complete log in /home/kk6/.pip/pip.log

ググったり人に聞いてみたりした

その節はお手数かけました>@
で、教えてもらったStack OverflowのページはPyQtに関する質問だったんだけど、PyQtではsetup.pyの代わりにconfigure.pyというものがあるらしい。で、configure.pyについて調べてたりしてたら最終的に以下のようなビルドスクリプトをgithubで発見した。

PySide/BuildScripts · GitHub

BuildScripts下準備

これがちょー簡単で、READMEの通りに実行するだけ。

$ git clone git:git://github.com/PySide/BuildScripts.git
$ cd BuildScripts
$ git submodule init
$ git submodule update

まずgithubから一式git cloneします。するとBuildScriptsというフォルダがホームに出来てるのでフォルダ内に移動して init と update をします。
で、OSに合わせてdependencies.xxxxxxx.shを実行。

$ sudo ./dependencies.ubuntu.sh

Mac OS XでHomebrew使ってる場合は

$ sudo ./dependencies.osx.sh

らしい。マカーじゃないからよくわかりませんが。

あと、Mac OS X の場合「dependenciesはC++ toolchainやQtライブラリをインストールしてくれないので、手動でXcodeとQt SDKをインストールしないといけません」とか書いてます。

build and install

$ ./build_and_install

でビルド。うちの環境だと1,2時間はかかったと思います…

ビルドできたら

buid_and_installでビルドが終了すると$HOMEにpkgというフォルダが出来ているので、pathを通せば使えるようになります。

ただしLD_LIBRARY_PATHが設定されてないと「ImportError: libpyside-python2.7.so.1.0: cannot open shared object file: No such file or directory」と言われてしまうので注意。(最初PYTHONPATHにpkg/pyside-sandbox/lib/python2.7/site-packagesだけを設定したらこうなった)

PATHの設定はBuilding_PySide_on_Linux | Qt Wiki | Qt Developer Networkを参考にしました。

export PYSIDESANDBOXPATH=$HOME/pkg/pyside-sandbox
export PATH=$PYSIDESANDBOXPATH/bin:$PATH
export PYTHONPATH=$PYSIDESANDBOXPATH/lib/python2.7/site-packages:$PYTHONPATH
export LD_LIBRARY_PATH=$PYSIDESANDBOXPATH/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=$PYSIDESANDBOXPATH/lib/pkgconfig:$PKG_CONFIG_PATH
# set -DENABLE_ICECC=1 if you're using the icecream distributed compiler
alias runcmake='cmake .. -DCMAKE_INSTALL_PREFIX=$PYSIDESANDBOXPATH -DCMAKE_BUILD_TYPE=Debug -DENABLE_ICECC=0'

これでちゃんとインポートできるようになった。

Python 2.7.2 (default, Aug 13 2011, 01:25:10) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import PySide
>>> PySide.__version__
'1.0.3'

実は最初、PATHの設定でtypoしてたのに気づかなくてPATHが通らなかったのでPythonbrew環境のPython2.7のsite-packagesにPySideフォルダを直接放りこんで無理やり動かしたのはここだけの秘密。