Python

Pythonのアプリを配布するために、実行できるようにexe化・app化する PyInstaller

Pythonでプログラミングをした結果を一般のユーザに配布したいと思った時ってありませんか。

とはいえ、プログラミングをしたことがないユーザに、Pythonのコードを渡して同じ環境を用意して実行してもらうというのは現実的ではないと思います。

それを解決するために、実行形式にする方法を紹介します。

前提

環境は、anacondaでpython 3.7の環境で準備しました。
また、本稿執筆時点で、サンプルコードにOpenCVを使用した状態でexe化できることを確認しました。
下記の記事を参考に環境を用意してください。

PyInstallerのインストール

いくつか方法がありますが、pip installで、githubから、パッケージ名からの方法2つを紹介します。

私は1つ目の方法でインストールしました。

pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip
pip install pyinstaller

PyInstallerを実行

画像をグレースケールにする下記のプログラムをexe化してみます。

import cv2

input_image_path = 'image.png'
output_image_path = 'image_gray.png'

# 画像の読み込み
image_input = cv2.imread(input_image_path)

# グレースケール化
gray_image = cv2.cvtColor(image_input, cv2.COLOR_BGR2GRAY)

# 画像の書き出し
cv2.imwrite(output_image_path, gray_image)

このファイルを下記のディレクトリに配置した状態にします。

C:\workspace\opencv_sample\gray_scale.py

C:\workspace\opencv_sample\ に移動し、下記のコマンドを実行します。

pyinstaller gray_scale.py --onefile --noconsole

–onefile : 実行のために必要なファイルを一つのファイル(.exe)にまとめる
–console : コンソールを表示
–noconsole : コンソールを非表示
–clear : ビルド前にキャッシュ、出力されているディレクトリ・ファイルを削除
–icon : .iconファイルを指定してアイコンを設定
–name : 出力される実行形式のファイル名を設定
など詳細はこちら

参考までに、私の実行環境のログを記載しておきます。

90 INFO: PyInstaller: 4.0.dev0+3e6f7dc709
90 INFO: Python: 3.7.6 (conda)
93 INFO: Platform: Windows-10-10.0.18362-SP0
95 INFO: wrote C:\workspace\opencv_sample\gray_scale.spec
97 INFO: UPX is not available.
100 INFO: Extending PYTHONPATH with paths
['C:\\workspace\\opencv_sample', 'C:\\workspace\\opencv_sample']

実行が成功すると下記のようなメッセージが表示されます。

92938 INFO: Building EXE because EXE-00.toc is non existent
92938 INFO: Building EXE from EXE-00.toc
92938 INFO: Appending archive to EXE C:\workspace\opencv_sample\dist\gray_scale.exe
93655 INFO: Building EXE from EXE-00.toc completed successfully.

C:\workspace\opencv_sample\dist\に移動して、グレースケール化したいファイルをimage.pngとして配置し、gray_scale.exeを実行します。

実行すると、image.pngがグレースケール化され、image_gray.pngというファイルが出来上がっていることを確認します。

まとめ

今回、exe化できることを確認しました。

このままでは、この例では、exe化する前のpythonファイルで指定された、コード上のファイル名のものでしか使えず不便です。

これを解決するためにPythonの標準的なGUIなど、今後の記事で紹介するものを利用して、ファイルを選択できるようにしてみましょう。

GUIを追加する記事を追加しました!