今時こんなこと、そんなに需要ないだろうからまぁいいんだけどさ。
とってもよろしくない。需要ないだろうということで、なのか、ドキュメントは結構酷いありさま。ただ、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箇所。一箇所目:
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箇所目:
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 で見繕うことまではしたくない)、くらいのものなら、まぁ用は足せるわよね。
def executable の方、Python 3.x では改良されてた:
1 def executable(path):
2 """Test for executable file."""
3 return os.access(path, os.X_OK)