しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

python.exe / pythonw.exe や ruby.exe / rubyw.exe の違いでよく悩むのでまとめておく

Python や Ruby の Windows 向けランタイムに含まれている pythonw.exe や rubyw.exe に関して、毎回悩むので PE ヘッダを調べて違いを確認しました。ちなみに w 無し版は実行した時にコンソールが表示されますが、w 有り版はコンソールが表示されません。

とりあえず dumpbin を使ってヘッダーをダンプします。

dumpbin python.exe /headers

それぞれの実行ファイルに対して dumpbin でヘッダーをダンプした結果から、重要な部分だけ引っ張ってきました。結局のところは異なるのは subsystem 部分だけです。

python.exe

OPTIONAL HEADER VALUES
            5.00 operating system version
            0.00 image version
            5.00 subsystem version
               0 Win32 version
            A000 size of image
             400 size of headers
            E816 checksum
               3 subsystem (Windows CUI)
            8000 DLL characteristics
                   Terminal Server Aware

pythonw.exe

OPTIONAL HEADER VALUES
            5.00 operating system version
            0.00 image version
            5.00 subsystem version
               0 Win32 version
            A000 size of image
             400 size of headers
            BD3E checksum
               2 subsystem (Windows GUI)
            8000 DLL characteristics
                   Terminal Server Aware

ruby.exe

OPTIONAL HEADER VALUES
            4.00 operating system version
            1.00 image version
            4.00 subsystem version
               0 Win32 version
           19000 size of image
             600 size of headers
           2092F checksum
               3 subsystem (Windows CUI)
               0 DLL characteristics

rubyw.exe

OPTIONAL HEADER VALUES
            4.00 operating system version
            1.00 image version
            4.00 subsystem version
               0 Win32 version
           19000 size of image
             600 size of headers
           17A7F checksum
               2 subsystem (Windows GUI)
               0 DLL characteristics

w 無しは subsystem が 3、w 有りは subsystem が 2 になります。単純にコンソール向けなのか、Windows 向けなのかという話です。

/SUBSYSTEM (サブシステムの指定)

MSDN によるとエントリポイントが main だとコンソール向け、WinMain だと Windows 向けになるとも書いてますね。基本的な Win32 の知識が必要な部分です。

Visual Studio のリンカー設定からサブシステムを変更可能です。

f:id:shiba-yan:20141221225314p:plain

ちなみに Win32 プロジェクトを作るときに選択できます。

f:id:shiba-yan:20141221225459p:plain

そして、それぞれの使いどころなんですが、ぶっちゃけどっちでもいいです。

Process.Start 時にコンソールを表示しないというオプションもあるので、それを使えば w 無し版でもコンソールを表示せずに実行できます。IIS の CGI / FastCGI で使う場合でも、どっちでも良さそうです。

どちらでも良いという結論は微妙な感じなので、CGI / FastCGI など Web 向けに使う場合には他の環境と合わせるために w 無し版を使う方向でいいと思いました。*1

*1:本当にどっちでもいい。