Python:バイナリでコンソールを表示しないようにするには?

Pythonのコードをwindows用exeにするには当然、 py2exe を使います。

で、そのとき、

python setup.py py2exe --windows

とすれば、コンソールを表示しないようにできます。

これはもう古いやり方で、現在のバージョンのpy2exeでは動きません・・・。現在はターゲットファイルの拡張子を.pywにする、もしくは windows = [{'script' : 'script.py', "icon_resources": [(1,"script.ico")]}] というオプションをsetupに渡す、という方法になっています。

今日、昔py2exeで作ったファイルが出てきたんですが、困ったことにpythonのソースファイルはない。いや、別に改良とかもうしないしいいんだけど。 ふと起動してみるとGUI with console。かっちょわりい。

コンソールが表示される、というのは単純にPEファイルのオプションなわけで。

image

この部分を変更してやればとりあえずは直る。ちなみに、

  • 00 00:未知のサブシステム
  • 01 00:デバイス ライバおよびWindowsNTネイティブプロセス用
  • 02 00:GUIで実行されるファイル
  • 03 00:コンソールで実行されるファイル
  • 07 00:Posixコンソールで実行されるファイル
  • 09 00:WindowsCEで実行されるファイル

なので02h 00hにしてやればオッケー。

Pythonでバイナリファイルの読み書きとかしたことないので練習もかねて。

# vim: fileencoding=utf-8
import sys
from struct import * 
target_file = len(sys.argv) > 1 and sys.argv[1] or sys.exit("Target file is not specified.")
target_file = unicode(target_file, "mbcs")
out_file    = open(target_file + "_gui", "wb")

io = open(target_file, "rb")
while 1 :
  if io.read(1) == "P" and io.read(1) == "E" : break
subsystem_pos = io.tell() +90 
io.seek(0)
out_file.write(io.read(subsystem_pos))
io.seek(4, 1)
out_file.write(pack('hh', 2, 0))
out_file.write(io.read())

io.close()
out_file.close()

こんな感じ。引数にexeファイルを渡せばオッケー。でも、適当なので全部のケースで動くかはあやしいw pythonではバイナリを扱うときはstructモジュールを使う、ということが分かりました(笑

comments powered by Disqus