Ubuntu Linux で virtualenv した Python を使うと、 meld やら hamster やらが動かない

Ubuntu Jaunty に upgrade した。
幾つかの拡張モジュールが動かなくなったのを期に、常用のPython環境を自分でビルドしたものからvirtualenvに変更。 .bashrc で PATH に追加した。
すると、meldをはじめ幾つかのパッケージが動かなくなった。見てみると、 #!/usr/bin/env python って…そこは #!/usr/bin/python として欲しかったな。
でも、virtualenv実行時に --no-site-packages をした覚えはない。 virtualenv だとディストリビューションパッケージはそのまま流用できると思って virtualenv したのに…と思って、 site.py とかを除いてみた。

Ubuntu では、 Python非標準パッケージを /usr/lib/python2.6/dist-packages にインストールしていた。普通は site-packages で、virtualenvもsite-packagesを期待しているので、うまくディストリビューションパッケージをimportできない。

virtualenv の lib/python2.6/site.py に次の修正を行って対策完了。

--- site.py.old	2009-04-22 13:46:01.000000000 +0900
+++ site.py	2009-04-22 13:26:57.000000000 +0900
@@ -215,7 +215,7 @@
                 sitedirs = [os.path.join(prefix,
                                          "lib",
                                          "python" + sys.version[:3],
-                                         "site-packages"),
+                                         "dist-packages"),
                             os.path.join(prefix, "lib", "site-python"),
                             os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")]
                 lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages")


先にに書いた方法だと、逆に virtual/lib/python2.6/site-packages がパスに追加されない。
正しくはこう。

--- site.py.old	2009-04-22 13:46:01.000000000 +0900
+++ site.py	2009-04-23 13:40:38.000000000 +0900
@@ -212,10 +212,15 @@
                                              "python" + sys.version[:3], "site-packages")]
 
             elif os.sep == '/':
-                sitedirs = [os.path.join(prefix,
+                sitedirs = [
+                        os.path.join(prefix,
                                          "lib",
                                          "python" + sys.version[:3],
                                          "site-packages"),
+                        os.path.join(prefix,
+                                         "lib",
+                                         "python" + sys.version[:3],
+                                         "dist-packages"),
                             os.path.join(prefix, "lib", "site-python"),
                             os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")]
                 lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages")
このブログに乗せているコードは引用を除き CC0 1.0 で提供します。