pip 非対応のモジュールを virtualenv で使うには(Windows 編)

プロジェクトごとに独立した Python インストール環境を作れる virtualenv は便利なのだけど、pip でのインストールに対応していないモジュールを使いたいとなるととたんに難しいことになる。Windows では標準で拡張モジュールをビルドできないこともあってインストーラーの配布形式(bdist_wininst)が長い間使われてきたので、古いパッケージだと pip でインストールできる wheel 形式での配布がなされていないものが多い。wxPython とか py2exe とかである。

しかし、一旦インストーラーでシステムの Python にインストールしたうえで、それらを virtualenv 環境のライブラリのディレクトリにリダイレクトしてやれば、virtualenv 環境からでもインポートできるようになる。リダイレクトといっても、ようは site-packages にハードリンクやジャンクションを張るだけだけど。

たとえば wxPython の場合、通常どおりインストーラーで導入してシステムの Python から使ってみると、

C:\Users\mshibata>python
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win 32
Type "help", "copyright", "credits" or "license" for more information.
>>> import wx
>>> wx.__file__
'C:\\Python27\\lib\\site-packages\\wx-3.0-msw\\wx\\__init__.pyc'
>>>

パッケージが C:\Python27\lib\site-packages\wx-3.0-msw\wx にあるということがわかる。そこで、virtualenv 環境があるディレクトリで、

C:\Users\mshibata\work>virtualenv venv
New python executable in venv\Scripts\python.exe
Installing setuptools, pip...done.
C:\Users\mshibata\work>mklink /j venv\Lib\site-packages\wx C:\Python27\lib\site-packages\wx-3.0-msw\wx
venv\Lib\site-packages\wx <<===>> C:\Python27\lib\site-packages\wx-3.0-msw\wx のジャンクションが作成されました

とすれば、

C:\Users\mshibata\work>venv\Scripts\activate.bat
(venv) C:\Users\mshibata\work>python
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win 32
Type "help", "copyright", "credits" or "license" for more information.
>>> import wx
>>>

とこのようにインポートできる。パッケージではなく単体のモジュールの場合は、ジャンクションではなくモジュールの .py ファイルへのハードリンクを張ればよい(けど、そういうのはふつうに virtualenv 環境にインストールできるか)。

py2exe もこの方法で virtualenv 環境で使えるようにすることができる。しかしこれだと py2exe がさらに読みこんでいる別のモジュールまではリダイレクトされていないので、ImportError が発生することがある。その場合は適宜足りてないモジュールへのリンクを張ればよい(いいかげんだ)。

最初だけなので手作業でやってもいいのだけれど、いちいちインポートされてるモジュールのパスを調べてコピペするのは面倒なので、上記の作業をやってくれるスクリプトを作ってみた。

C:\Users\mshibata\work>redirect-package.py venv wx py2exe
venv\Lib\site-packages\wx <<===>> C:\Python27\lib\site-packages\wx-3.0-msw\wx のジャンクションが作成されました
venv\Lib\site-packages\py2exe <<===>> C:\Python27\lib\site-packages\py2exe のジャンクションが作成されました

と、こんなふうに使う。

サイトを Bitbucket から更新する

レンタルサーバのファイルを Bitbucket で管理・更新する話。

うちのページはファイルを Bitbucket の Git リポジトリ(プライベート)で管理している。以前はレンタルサーバの中に Subversion をインストールしてそこで管理していたのだけど少し前に引っ越した。

引っ越す前は、SSH 経由で更新用のスクリプトを実行させて、サーバ内のリポジトリから更新分をチェックアウトせさるという形で更新していたのだけど、リポジトリを Bitbucket に移行させたのを機にこのプロセスも見なおすことに。もちろんいままで同様にスクリプトを(git で更新分を引っ張ってくるように書き替えて)呼び出してもいいのだけれど。

ちなみに、なぜかいまではさくらのレンタルサーバでは最初から git コマンドが使える。

GitHub、Bitbucket のコミット(プッシュ)時のフックに登録してそのサーバの(公開用の)Git 作業コピーを更新するという PHP スクリプトが GitHub にあったのでそれを試してみる。

Bitbucket 用と GitHub 用のふたつのスクリプトがあります。ちなみに名前の通りリポジトリの種類は Git のみ。Mercurial は使えない。

これをレンタルサーバの公開用ディレクトリのどこかに展開。そのあと Bitbucket のコンテンツを格納しているリポジトリの設定で “Hooks” に POST フックとしてその URL を貼る。

これで手元の作業コピーから変更をプッシュすると自動的にレンタルサーバのコンテンツもアップデートされるようになった。めでたしめでたし。

2015-02-14 追記: その後気づいた点。当たり前かもしれないけど、Bitbucket のほうでマージしただけじゃフックは呼び出されないね。あくまでコミットで動く。

tcsh で virtualenv を有効化する

さいきん清水川さんの新しい本のレビューをさせていただいていて、pip とか virtualenv とか wheel とかの知識をフライングゲットしてにわかに盛り上がっています。

virtualenv で環境作って有効化するとき、シェルが bash なら venv/bin/activate コマンドで有効化するのだけど、自分はシェルが tcsh なので source venv/bin/activate.csh としなければならない。

これは面倒なので、.cshrc にエイリアスを定義してみた。

alias activate source "\!*/bin/activate.csh"

これで tcsh でも activate venv と打つだけで有効化できる。引数間違えたりとかするとおかしなことになるけど、まあそれは気が向いたら改善しよう。

wz2chbbs 停止

まだ止めてませんが、wz2chbbs はそろそろ止めてもよいかしら?

今年の春くらいまでは使われてる方がいたようだけど、さいきんは利用されてないっぽい。

Windows で GNU ツールを使う

ふだんやってる Tips みたいなことは、簡単なことでもどんどん書いておくことにする。

開発用には Windows でも make や tar や touch を使いたい。Makefile を書くなら mv や cp や rm もないと面倒くさい。そこで、Windows 用にビルドされた Gnu のツールを PATH の通ったフォルダに入れておくとよい。

から入手できる。ぜんぶをまとめたのもダウンロードできるけど、自分は CoreUtils, Make, Tar くらいしか入れてない(find とか sort は Windows 標準のと被るので)。ようするにベーシックな Makefile が動けばいいという感じ。凝ったことはせずコマンドプロンプト(cmd.exe)で make と叩くのに使うだけで、個別のコマンドを使うことはあまりない(touch や tar くらいか)。

最近気づいたのだけど、Patch は Windows 8.1 で使おうとすると UAC の警告に阻まれてふつうに使えない。OS 全体で UAC を無効にするのがいやなら、‘Using “patch” from the GnuWin32 project on Windows 7’ に書かれている方法で exe に manifest を埋め込むとよい。

これだけで自前のたいていの Makefile は Windows と OS X (Unix) とで共用できるようになるので重宝。Visual Studio の nmake は、Windows 専用の開発にならいいけど、Python とかのプロジェクトにはなんかしっくりこないからね。