Windows版 Python で CGI 画像出力 (改行コードに注意)

結論
# WindowsPython は \x0a を \x0d \x0a に自動変換するので
# バイナリデータが壊れる。これを防ぐには…
if sys.platform == "win32":
	import os, msvcrt
	msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
発端

Content-type: image/gif や image/png, image/jpeg といった「画像を出力する CGI プログラム」を WindowsPython で書こうとしたが、うまくいかない。同じプログラムを ubuntu で動かすと、ちゃんと画像が表示された。

調査

既存のPNGファイルをそのまま (Content-type:だけ先頭につけて) 出力する C++ プログラムを書き、これをCGIとして実行した→うまくいった。
同等の処理をやる Pythonプログラムを書き、これをCGIとして実行した。ただし Apache サーバは Windowsマシン。→ダメだった。
DOS窓で、 C++ 版・ Python 版の出力をそれぞれファイルにリダイレクトした。2つのファイルをバイナリエディタで見比べた。相違があった。例えば PNG ファイルのヘッダにある

89 50 4E 47 0D 0A 1A 0A

という部分が、 Python 版では

89 50 4E 47 0D 0D 0A 1A 0D 0A

となっている。これでは正常なPNGファイルではない。

解決

"python stdout newlines" でぐぐると、こんなのがあった。
http://code.activestate.com/recipes/65443/
解決した。
他の日本人Python使いもハマっているかもしれないので、ここに書いておく。