Pythonのコードをwindows用exeにするには当然、py2exeを使います。
で、そのとき、 python setup.py py2exe --windows とすれば、コンソールを表示しないようにできます。
Note:これはもう古いやり方で、現在のバージョンのpy2exeでは動きません・・・。現在はターゲットファイルの拡張子を.pywにする、もしくはwindows = [{'script' : 'script.py', "icon_resources": [(1,"script.ico")]}]というオプションをsetupに渡す、という方法になっています。
今日、昔py2exeで作ったファイルが出てきたんですが、困ったことにpythonのソースファイルはない。いや、別に改良とかもうしないしいいんだけど。
ふと起動してみるとGUI with console。かっちょわりい。
コンソールが表示される、というのは単純にPEファイルのオプションなわけで。
この部分を変更してやればとりあえずは直る。ちなみに、
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モジュールを使う、ということが分かりました(笑