2020-10-11

PyInstaller を使ってみる

定型的な業務から逃れるため、Python で GUI アプリを作って自動化することに精を出しています。使用実績を上げれば、次のステップとして、作ったツールをチームで共有したくなります。メンバーが自分と同じように Python を使えるのであれば悩むことはありませんが、残念ながらそうではありません。😭

自分が作ったツールを他の人に使ってもらうために Python の環境を準備してもらうことが現実的でないとき、動作に必要なファイルをまとめてパッケージとして共有できれば便利です。会社業務で使う Windows 上でできればとても助かります。そんなニーズをかなえてくれるのが PyInstaller です。

PyInstaller とは

PyInstaller は Python アプリと依存するライブラリなどのファイルを一つのパッケージにまとめます。ユーザーは、Python インタプリタやモジュールをインストールすることなく、パッケージ化されたアプリを実行することができます。

PyInstaller は Python 3.5 以降をサポートし、NumPy, PyQt, Django, wxPython などの主要な Python パッケージを正しくバンドルします。PyInstaller は Windows, Mac OS X, GNU/Linux でテストされています。しかし、クロスコンパイラではありません: Windows アプリを作るには Windows 上で、GNU/Linux アプリを作るには GNU/Linux 上で PyInstaller を実行します。

PyInstaller Manual より引用・翻訳

PyInstaller を使ってみる

使用した OS 環境は下記の通りです。

Windows 10 Home (x64) 1909, 18363.1110
» Python 3.8.6 python-3.8.6-amd64.exe

※ Python は Microsoft Store のものではなく、https://www.python.org/downloads/release/python-386/ からダウンロードしたパッケージをインストールして使っています。

wxPython 版 Hellow World!

ここでは、wxPython を使った簡単な GUI アプリ(下記)を PyInstaller でパッケージ化してみます。

hello_wx.py
hello_wx.py の実行例

プログラムの実行にアイコンファイルを使っています。github にリポジトリを用意しましたので、git で下記のように clone してご利用ください。

git clone https://github.com/bitwalk123/hello.git

PyInstaller をインストール

コマンドプロンプトを起動して pip で PyInstaller をインストールします。

pip install pyinstaller
pyinstaller のインストール

PyInstaller で hello_wx.py をパッケージ化する

コマンドプロンプトを起動してパッケージ化したいファイル(この例では hello_wx.py)があるディレクトリに移って pyinstaller コマンドを実行してもいいのですが、運用上、別のフォルダでパッケージを作成することにします。

hello_wx.py

d:\bitwa\Projects\hello\hello_wx.py

パッケージを作成するディレクトリ

d:\bitwa\Packages

git clone したディレクトリ内にある pkinstaller.ico を、あらかじめ、パッケージを作成するディレクトリ内にコピーしておきます。これはパッケージ化した exe 形式のファイルのアイコンに使います。

コマンドプロンプトを起動して、パッケージを作成するディレクトリへ移り、pyinstaller コマンドを実行します。

Microsoft Windows [Version 10.0.18363.1110]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Users\bitwa>d:

D:\>cd bitwa\Packages

D:\bitwa\Packages>dir
 ドライブ D のボリューム ラベルは SD です
 ボリューム シリアル番号は E0E1-F674 です

 D:\bitwa\Packages のディレクトリ

2020/10/11  08:48    <DIR>          .
2020/10/11  08:48    <DIR>          ..
2020/10/10  22:36            16,958 pyinstaller.ico
               1 個のファイル              16,958 バイト
               2 個のディレクトリ  119,623,282,688 バイトの空き領域

D:\bitwa\Packages>pyinstaller -w -i pyinstaller.ico d:\bitwa\Projects\hello\hello_wx.py
1294 INFO: PyInstaller: 4.0
1294 INFO: Python: 3.8.6
1299 INFO: Platform: Windows-10-10.0.18362-SP0
1304 INFO: wrote D:\bitwa\Packages\hello_wx.spec
1314 INFO: UPX is not available.
1339 INFO: Extending PYTHONPATH with paths
['d:\\bitwa\\Projects\\hello', 'D:\\bitwa\\Packages']
1444 INFO: checking Analysis
...
(途中省略)
...
27536 INFO: Building COLLECT COLLECT-00.toc
40317 INFO: Building COLLECT COLLECT-00.toc completed successfully.

D:\bitwa\Packages>

今回使用したオプションの -w は、実行時にコンソールを表示しないようにする GUI アプリ向けのオプションです。-i は、作成する exe 形式のファイルのアイコン表示に指定するオプションです。最後に、パッケージにする Python スクリプトのパスを指定します。PyInstaller のオプション詳細は、参考サイト [1] にあります。

PyInstaller を実行した後、builddist のフォルダ、hello_wx.spec というファイルが生成されます。

PyInstaller 実行後のディレクトリ

パッケージ化されたファイルは dist\hello_wx にあります。

PyInstaller で生成された hello_wx.exe ファイル

生成された hello_wx.exe ファイルの他に、ランタイムライブラリなどの関連ファイルがたくさんあります。これが煩わしい場合は、pyinstaller コマンド実行時に -F オプションを付けると、大きなサイズの単一ファイルになります。

動作確認

動作確認のため hello_wx.exe ファイルをダブルクリックしたところ、./wx.ico が見つからないというエラーが出ました。

hello_wx.exe の実行例 (1)

プログラムが読み込む ico ファイルまではパッケージ化してくれないようです。これは wx.ico をパッケージのフォルダ内にコピーすることで解決しました。

hello_wx.exe の実行例 (2)

アプリケーションが使用するアイコン類は、最終的にはエンコードして Python のスクリプト内に記述することにします。

たったこれだけのプログラムなのにランタイムライブラリなどを含めるとこんなサイズになります(下記)。

パッケージ化した hello_wx フォルダのサイズ

まとめ

PyInstaller の使い方については、もうすこし使い込んでから、使用例を含めてまとめる予定です。

個人的には、大きなサイズの単一の exe 形式のファイルにすることにはあまり興味が無く、exe 形式のファイル + 関連ファイルが一つのフォルダ内に収まれば御の字です。あとは Inno Setup などでインストーラを作成すれば完璧です。😃

参考サイト

  1. PyInstaller Manual — PyInstaller 4.0 documentation
  2. Inno Setup

ブログランキング・にほんブログ村へ
にほんブログ村

0 件のコメント: