今回はPyinstallerでpythonファイルをexe化して,Pythonのインストールされていない環境でも動作するようにします.
exe化することでPython環境の整っていない第三者に配布したり,タスクスケジューラで定期実行したりできるようになります.
【参考(外部サイト)】PyInstaller Manual — PyInstaller 6.10.0 documentation
【参考(外部サイト)】WindowsのタスクスケジューラでPythonファイルを定期実行する
まずはPyinstallerをインストールします.
pip install pyinstaller
次にexe化するためのpythonファイルを作ります.名前はtest.pyにしておきます.
print("A+Bを計算します.")
a = int(input("A:"))
b = int(input("B:"))
print(a+b)
input("エンターキーを押して終了...")
コマンドプロンプトに以下のコマンドを打ち込んでtest.pyをexe化できます.
buildフォルダとdistフォルダの2つのフォルダが作成されます.
distフォルダ内のtest.exeを実行するとAとBの足し算ができます.
pyinstaller test.py
Pyinstallerではexe化する際にいくつかのオプションを指定することができます. 以下は主なオプションです.オプションは組み合わせて指定できます.
pyinstaller --onefile test.py
pyinstaller --noconsole test.py
pyinstaller --name=MyCalculator test.py
pyinstaller --add-data ImageFolder test.py
pyinstaller --hidden-import=module_name test.py
onefileにしなかった場合,exeファイルのみを移動すると依存ファイルが見つけられなくなり動かなくなります. 依存ファイルごと移動する必要があります.
使わないライブラリをインポートすると依存ライブラリとして出力ファイルに追加されてしまい,起動が遅くなったりファイルサイズが増えます. 例えば,test.pyに import pandas を1行追加するだけで起動速度が遅くなりファイルサイズが5.77MBから106MBまで増えました.
たくさんの外部ライブラリに依存している場合に依存関係が複雑になるため,必要以上のライブラリが追加されてしまうことがあります. これを防ぐために最小限必要なライブラリのみをインストールした仮想環境を作りPyinstallerを使うことでファイルサイズを小さくすることができます. test.pyのような外部ライブラリに依存していない(または依存関係が明確)な場合は必要ありませんが,たくさんの外部ライブラリを使用していて依存関係が複雑な場合に有効です.
python -m venv myenv
.\myenv\Scripts\activate
---- ここで必要なライブラリをインストール ----
pip install pyinstaller
pip install numpy など
-------------------------------------------
pyinstaller test.py
エラーが起きてしまったり,うまく起動しない場合はダブルクリックではなくコマンドプロンプトから test.exe と打ち込んで実行してエラーメッセージを確認してください. noconsoleオプションを有効にしている場合は無効にしてメッセージが表示されるようにしてください.
Pyinstallerを実行している環境に必要なライブラリがインストールされているかを確認してください. インストールされていた場合はhidden-importで必要なライブラリを手動で追加してください.
ファイルが見つからない場合はパスの指定方法を以下のように変えてください. 【参考(外部サイト)】Pyinstaller and --onefile: How to include an image in the exe file
# https://stackoverflow.com/questions/31836104/pyinstaller-and-onefile-how-to-include-an-image-in-the-exe-file
import os
def resource_path(relative_path):
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
image1 = Image.open("image.png")
# to:
image1 = Image.open(resource_path("image.png"))
numpyなどの外部ライブラリを利用している場合,ライセンスや著作権の問題に気を付ける必要があります. exe化に使用した仮想環境でpip-licensesを使うことでライセンスに関する情報を表示することができます.
pip install pip-licenses
pip-licenses
ライセンスに関する情報は著作者とホームページのURLなども表示できます.
以下のコマンドでライブラリ名,ライセンス,著作者,URLをテキストファイルにできます.
pip-licenses --with-authors --with-urls > licenses.txt
データが欠損していたり間違っていることもあるのでURLを参考にライセンスや著作権表示に関して必要があります.