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

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ファイルのオプションなわけで。

pe.jpg

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

  • 00 00:未知のサブシステム

  • 01 00:デバイス ライバおよびWindowsNTネイティブプロセス用

  • 02 00:GUIで実行されるファイル

  • 03 00:コンソールで実行されるファイル

  • 07 00:Posixコンソールで実行されるファイル

  • 09 00:WindowsCEで実行されるファイル

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

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

python code
  1. # vim: fileencoding=utf-8
  2. import sys
  3. from struct import *
  4. target_file = len(sys.argv) > 1 and sys.argv[1] or sys.exit("Target file is not specified.")
  5. target_file = unicode(target_file, "mbcs")
  6. out_file = open(target_file + "_gui", "wb")
  7.  
  8. io = open(target_file, "rb")
  9. while 1 :
  10.   if io.read(1) == "P" and io.read(1) == "E" : break
  11. subsystem_pos = io.tell() +90
  12. io.seek(0)
  13. out_file.write(io.read(subsystem_pos))
  14. io.seek(4, 1)
  15. out_file.write(pack('hh', 2, 0))
  16. out_file.write(io.read())
  17.  
  18. io.close()
  19. out_file.close()
  20.  

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

Related posts:

07.27.08/12am

No comments yet

trackback uri
  • ajax-loading
  • ajax-loading
  • ajax-loading

Leave a Comment

You can use these tags: <code>, <i>, <em>, <strong>, <a>

About

Author:yuin(http://inforno.net/)

文学部文化学科卒という生粋の文系趣味プログラマ。

主にRuby、Javascript、PHP、JAVA,Python,C,Scala,Schemeなどを使っています。今はPythonな感じかもしれない。今後作曲活動なども復活するかもしれない。

Pages