Windows MSYS シェルスクリプトとして書いた CGI を Python の CGIHTTPServer でテスト

今時こんなこと、そんなに需要ないだろうからまぁいいんだけどさ。

とってもよろしくない。需要ないだろうということで、なのか、ドキュメントは結構酷いありさま。ただ、SimpleHTTPServerと同じであろ、と予測をつければ、簡単なはずだ:

1 me@host: cgitest$ ls -F
2 cgi-bin/ index.html
3 me@host: cgitest$ ls -F cgi-bin
4 hoge.cgi*
5 me@host: cgitest$ python -m CGIHTTPServer
6 Serving HTTP on 0.0.0.0 port 8000 ...

これでブラウザから http://localhost:8000/ でカレントディレクトリをリスティングしつつ、「cgiを実行出来る」ことになっている

けど動かせる CGI は「Windows アプリケーションとして有効なもの」か「Python スクリプト」の二者択一、そのままでは。前者はつまり、exe もしくは DOS のバッチファイルとか。厳密には、subprocess.Popen で直接実行出来るもの。つまり、MSYS とか Cygwin のシェルスクリプトは実行出来ない。

CGIHTTPServer が柔軟な作りだったら「直接書き換え」なんてしなくていいはずなんだけれど、硬直した作りになっちゃってるんで、丸ごとコピーして書き換えるかしないと対応でけません。2箇所。一箇所目:

行番号は Python 2.7.9 版のもの
362 def executable(path):
363     """Test for executable file."""
364     try:
365         st = os.stat(path)
366     except os.error:
367         return False
368     #return st.st_mode & 0111 != 0
369     return True

Windows で実行出来ます、とドキュメントは言うけれど、これでは実行出来るはずはない。(Windows 版 CPython の os.stat の言う「実行可能ビット」はこれは「ダブルクリックして実行出来るもの」と等価。)

2箇所目:

行番号は Python 2.7.9 版のもの
257         else:
258             # Non Unix - use subprocess
259             import subprocess
260             cmdline = ["sh", scriptfile]  # execute by bash (it can be `sh')

sh.exe はパスが通ってる必要がある…のは当然です、よ。

もちろんこれをしてしまうと今度は exe や bat の起動が出来なくなるわけで、「正しい」措置ではないす。ま、ちょいと「本物の」サーバにデプロイする前に動作確認したい(けど煩わしいので「本物の WEB サーバ」を Windows で見繕うことまではしたくない)、くらいのものなら、まぁ用は足せるわよね。

2015-07-06 12:17追記
def executable の方、Python 3.x では改良されてた:

1 def executable(path):
2     """Test for executable file."""
3     return os.access(path, os.X_OK)