さり海馬

Thoughts walk away, blog stays.

Apache+mod_wsgiでPySVNを使ったらうまくいかないでござるの巻

あるいは 「"DLL not found" を解決するにはどうしたら…」

今さら python + Django でウェブアプリなんか作っている thalion です。作ろうとしているのは:

  • リポジトリのURLとリビジョンを入れるフォームがあって
  • それを入れて「実行」ってやると
  • そのリビジョンに該当するファイル群に対して変換プログラムを実行してのコードを生成し、
  • そいつをzipに固めてダウンロードする

という仕事をするもの。それほど複雑でもなさそうなので、Djangoの勉強をかねて作ってみることに。ちなみに空いているマシンがなかったので、俺のデスクトップPCを使うことに。Windows XP SP3 + Python 2.6.2 + Django 1.1。

SVNリポジトリへのアクセス

SVN リポジトリからファイルを取り出す処理は、PySVN というとても素晴らしいパッケージがあるので、そっちを利用したら30分程度でできた。いつも思うんだけど、python ってこういう楽できる環境が素晴らしい。

Windowsの別プロセスをpythonから使う

変換プログラムは、実は Java で書かれているんで困ったんだけど、python の subprocess を使うと意外と簡単にできる上に、戻り値まで拾えることが分かった。ありがたい。

zip化

ありがとうございます。ほとんどそのまま利用します。

ダウンロード

これは django の HttpResponse() を使って簡単に。

で桶。

開発サーバー(manage.py runserver) でやってみる

…問題なく動く。おし。

デプロイ用サーバー Apache + mod_wsgi でやってみる

あたりを参考に。

暗礁

…あれ、上手くいかない。"DLL load failed: The specified module could not be found." pysvn の DLL がロードできないっていって、mod_wsgi で起動してる python スクリプトがコケるよ?

別のプロジェクトを作って "Hello world" してみたら、そっちはまともに表示できるので、デプロイ自体ではなく、どうも apache で起動されているプロセスで、DLL の検索パスが宜しくない感じ。

早速環境変数 "PATH" の最後に"C:\Python26\Lib\site-packages\pysvn"を追加して、念のためリブートしてやってみる。

…やっぱダメだ。どうやらこの環境変数をいじっても、apache が起動しているプロセスのDLL検索パスに反映されないっぽい。

大技→挫折

DLL が見つからないのなら、見えるところに突っ込んじゃえばいいのよ。ということで、名前に重複がないのを確認した上で、上記のディレクトリ内にある pysvn の DLL 群と manifest ファイルを c:\windows\system32 の中にコピー!

…動くようにはなりましたが、manifestが正しくないってダイアログが出てしまって、そのボタンを押してやらないと処理がそこで進まなくなります…。むむむむ。