Pythonのコードを実行形式ファイルにまとめる
pythonで書いた複数のファイルで構成されるアプリケーションを一つの実行形式ファイルとしたい。
ずっと前に、py2exeやbbfreezeを検討してみたが、最近知ったPyInstallerは非常に使いやすいように感じる。ユーザが設定することが少ないのでよい。Windows、Linux、MacOS、すべてで使えるし。サードパーティ製のパッケージの対応状況(SupportedPackages)を見ても幅広く対応できている。
使い方は、http://takanory.net/takalog/1072 にあるように、Makespec.pyでspecファイルを作成し、Build.pyを実行すればよい。
また、例えば下のようなmain.pywとsub.pyにファイルが分かれたディレクトリ構成のパッケージの場合、
+ main.pyw | + sub/ | + sub.py
同じディレクトリにすべてのファイルを置いているときにやるように、単純に、
$ Makespec.py --onefile --windowed main.pyw $ Build.py main.spec
としても、正常に動作するmain.exeファイルは得られなかった。このように他のディレクトリのファイルを参照する場合には、明示的に指定しなければいけないようだ。ここでは、main.specファイルの中のpathexにディレクトリを追加すればよい。
Makespec.pyを実行することで作られた、main.specの内容は以下の通り。DドライブのpyInstallerフォルダの中に、main.pywとsubフォルダが置かれている状況。
# -*- mode: python -*- a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\unpackTK.py'), os.path.join(HOMEPATH,'support\\useTK.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'main.pyw', os.path.join(HOMEPATH,'support\\removeTK.py')], pathex=['D:\\pyInstaller']) pyz = PYZ(a.pure) exe = EXE(TkPKG(), pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name=os.path.join('dist', 'main.exe'), debug=False, strip=False, upx=True, console=False ) app = BUNDLE(exe, name=os.path.join('dist', 'main.exe.app'))
ここで、pathexにディレクトリパスを追加して、pathex=['D:\\pyInstaller', 'D:\\pyInstaller\\sub']としてみた。そうしたら正常に動作する実行ファイルが作れた。