あゝ、めんどくさい

めんどくさがり屋のIT勉強録

pythonスクリプトのEXE化

pythonは便利な言語だ。なんにでも使える。たとえばGUIをつけてコマンドラインツールをWindowsの画面から利用するなんてのもお茶の子さいさいだ。

「そう、だがpythonスクリプトWindowsのタスクバーに置いたりできない。不便だと思わないか?」

またかい。batファイル書いてデスクトップに置いておけっていうんだ。

pythonスクリプトWindowsのネイティブアプリにする。すると誰のPCに入っているpythonは2系で、誰のにはPyQtが入っていない……なんて気にしなくていい。これができれば大幅に効率アップすると思うんだけどなぁ」

はいはい、バルスバルス……じゃなかった、調べますよ。

pyinstallerというアプリ

Googleで調べるとすぐに出てきた。あまり凝ったことはできないが、とりあえず必要なライブラリを固めて1個のEXEファイルにできるらしい。

物は試しだ。とりあえず簡単なコードを書く。あまりに雑だが勘弁してくれ。python3から実行すると、ボタンが1つ表示されるウィンドウが開くアプリだ。


#!/usr/bin/python3

from tkinter import Tk, ttk

root = Tk()
btnframe = ttk.Frame(root)
btn = ttk.Button(btnframe, text='button')

btnframe.grid()
btn.grid()

root.mainloop()

このコードと同じディレクトリにアプリアイコン用のicoファイルを置く。pyinstallerはスクリプト中でimportしているpythonのパッケージは自動的に収集するが、ctypesでdllなんかを読み込んでいる場合は同じディレクトリに置いた方がいい予感がするが試していない。

次にsetup.pyを使ってpyinstallerをインストールする。VisualStudio付属のcpythonを使っている場合は「c:\Program Files\Python36\Scripts」以下にインストールされる。

さっそくビルドしてみる。

"c:\Program Files\Python36\Scripts\pyinstaller.exe" TestNativeApp.py --onefile --clean --noconsole --icon=utilities-terminal.ico --windwed

オプションの「--onefile」はzip化して1つのファイルにまとめるもの。「--clean」はmakeでいうところのmake cleanみたいなものか。「--noconsole」と「--windowed」は起動の際にコンソール(コマンドプロンプト)を開かないようにする。「--icon」はアイコンファイル(Windowsの場合はicoファイル)の指定。

処理が終わると作業フォルダ内に「dist」フォルダができあがる。中にEXEファイルが保存されている。ダブルクリックで開くこともできるし、タスクバーに置くこともできる。

ただ一つ失敗したなぁと思ったのはアイコン。急いで128×128pxのファイルを用意したが、これだけだとExplorer上では特大~中アイコンで表示した際にはカスタムアイコンが表示されるが、そのほかのレイアウトを選択した場合、デフォルトのアイコンで表示される。イメージを統一するためにはマルチアイコン形式で用意するのがいい。

確かに便利だなぁ。これならffmpegなんかのフロントエンドをpythonで書いてEXE化、なんてのもやってみたいが、EXEの中にEXEを固めるなんてことができるのだろうか。まあ、いつかやってみよう。