トップページ -> PyQtでリアルタイム音階判定GUIアプリを作ってみた -> Pyinstallerでexe化する

Pyinstallerでexe化する

今回はPyinstallerでpythonファイルをexe化して,Pythonのインストールされていない環境でも動作するようにします. exe化することでPython環境の整っていない第三者に配布したり,タスクスケジューラで定期実行したりできるようになります.
【参考(外部サイト)】PyInstaller Manual — PyInstaller 6.10.0 documentation
【参考(外部サイト)】WindowsのタスクスケジューラでPythonファイルを定期実行する

1. Pyinstallerの使い方

まずは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

2. Pyinstallerで使えるオプション

Pyinstallerではexe化する際にいくつかのオプションを指定することができます. 以下は主なオプションです.オプションは組み合わせて指定できます.

(1) onefile

すべてのファイルを1つの実行ファイルにまとめます.起動速度が遅くなったりファイルサイズが大きくなることがあります.
※ 依存ファイルを1つのフォルダにまとめるだけであればPyinstaller5ではなくPyinstaller6.10を使えばonefileを使わずに実現できます.

pyinstaller --onefile test.py

(2) noconsole

コンソールウィンドウを表示しないようにすることができます. 上のtest.pyはコンソールから入力を受け取ることを前提としているため使うことができませんが,GUIアプリなどコンソールでの入力・出力を必要としない場合は表示しないようにできます. noconsoleを使うと外部ライブラリを使用しているときに進捗バーなどを表示できずにエラーになることがあります.(noconsoleで使うには進捗バーなどの表示設定を変える必要があります)

pyinstaller --noconsole test.py

(3) name

出力ファイルの名前を指定することができます.以下のようにすると出力ファイルの名前をMyCalculatorに設定できます.

pyinstaller --name=MyCalculator test.py

(4) add-data

出力ファイルにデータフォルダを含めるようにします. 例えば,GUIアプリの画像ボタンに使う画像などを追加できます.(手作業で追加しても動きます)

pyinstaller --add-data ImageFolder test.py

(5) hidden-import

Pyinstallerによって自動で検出されない依存関係を手動で追加します. exeファイルの実行がうまくいかなかったときにModule not foundなどと書いてあったらhidden-importで追加するとうまくいくかもしれません.

pyinstaller --hidden-import=module_name test.py

3. exe化する際の注意点

(1) exeファイルだけを移動すると動かなくなる

onefileにしなかった場合,exeファイルのみを移動すると依存ファイルが見つけられなくなり動かなくなります. 依存ファイルごと移動する必要があります.

(2) 使わないライブラリをインポートしない

使わないライブラリをインポートすると依存ライブラリとして出力ファイルに追加されてしまい,起動が遅くなったりファイルサイズが増えます. 例えば,test.pyに import pandas を1行追加するだけで起動速度が遅くなりファイルサイズが5.77MBから106MBまで増えました.

(3) 仮想環境を使ってbuildする

たくさんの外部ライブラリに依存している場合に依存関係が複雑になるため,必要以上のライブラリが追加されてしまうことがあります. これを防ぐために最小限必要なライブラリのみをインストールした仮想環境を作りPyinstallerを使うことでファイルサイズを小さくすることができます. test.pyのような外部ライブラリに依存していない(または依存関係が明確)な場合は必要ありませんが,たくさんの外部ライブラリを使用していて依存関係が複雑な場合に有効です.


python -m venv myenv
.\myenv\Scripts\activate

---- ここで必要なライブラリをインストール ----
pip install pyinstaller
pip install numpy など
-------------------------------------------

pyinstaller test.py

4. エラーが起きた・うまく起動しない場合

エラーが起きてしまったり,うまく起動しない場合はダブルクリックではなくコマンドプロンプトから test.exe と打ち込んで実行してエラーメッセージを確認してください. noconsoleオプションを有効にしている場合は無効にしてメッセージが表示されるようにしてください.

Module not found

Pyinstallerを実行している環境に必要なライブラリがインストールされているかを確認してください. インストールされていた場合はhidden-importで必要なライブラリを手動で追加してください.

file not found

ファイルが見つからない場合はパスの指定方法を以下のように変えてください. 【参考(外部サイト)】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"))

5. exeファイルを配布する際の注意

numpyなどの外部ライブラリを利用している場合,ライセンスや著作権の問題に気を付ける必要があります. exe化に使用した仮想環境でpip-licensesを使うことでライセンスに関する情報を表示することができます.


pip install pip-licenses
pip-licenses
ライセンスに関する情報は著作者とホームページのURLなども表示できます. 以下のコマンドでライブラリ名,ライセンス,著作者,URLをテキストファイルにできます.

pip-licenses --with-authors --with-urls > licenses.txt
データが欠損していたり間違っていることもあるのでURLを参考にライセンスや著作権表示に関して必要があります.

<- 前へ戻る 【目次に戻る】