標準ではないライブラリを使用しているPythonプログラムをexe化する
友人が作成したPythonプログラムのexe化に難航したので対応をまとめておきます。
exe化にはPyInstallerを使用しました。
仮想環境の構築にはPipenvを使用しました。
実行環境
- Windows11
- PowerShell
- Python 3.10.6
目次
- 手順
- 失敗したときのこと
- 参考サイト
手順
- Python3がインストールされていることの確認する
- Pipenvをインストールする
- 仮想環境を構築する
- .pyプログラムに記載されているもののうち、必要なライブラリをインストールする
- PyInstallerをインストールする
- PyInstallerでpyファイルをexe化する
- 仮想環境を削除する
1.Python3がインストールされていることを確認する
PowerShellを起動します。Python3がインストールされているか確認します。
python3 --version
インストールされていない場合はPython3をインストールします(手順は割愛)。
2.Pipenvをインストールする
Pipenvがインストールされているか確認します。
pipenv --version
インストール済なら以下のコマンド実行はスキップし、手順3へ。
以下のコマンドでPipenvをインストールします。
pip install pipenv
3.仮想環境を構築する
仮想環境を作るフォルダ(.pyが置いてある)パスへ移動します。
cd [フォルダパス]
仮想環境を有効化します。
pipenv --python 3.10
pipenv shell
4. .pyプログラムに記載されているもののうち、必要なライブラリをインストールする
今回使ったライブラリは以下の通りです。うち太字のものは追加インストールが必要なため、pipを利用してインストールします。
- tkinter
- tkinterdnd2
- Pillow
- pyperclip
- os
pip install tkinterdnd2 Pillow pyperclip
5. PyInstallerをインストールする
以下のコマンドでPyInstallerをインストールします。
pip install pyinstaller
6. PyInstallerでpyファイルをexe化する
以下のコマンドでexeファイルを生成します。distフォルダ内に.exeができます。
生成されたexeは単体で実行可能です。
pyinstaller color_picker.py --onefile --collect-data tkinterdnd2
オプションについて
-
--onefile
distフォルダに出力されるexeを1ファイルにまとめます。 -
--collect-date
tkinterdnd2をパッケージ化するのに必要です。このオプションを付けずに生成したexeを実行した際、ライブラリの読み込みに失敗します。
7. 仮想環境を削除する
仮想環境のshellから抜け、仮想環境を削除します。
exit
pipenv --rm
失敗したときのこと
2つの理由でexe化に難航しました。
- PyInstallerオプションの「--collect-date」がなかなか見つからなかった
- ChatGPT3.5に質問したら、「.specの設定を変更する」を案内されたが、うまくいかなかった
「--collect-data」オプションを付けずに生成したexeは、ライブラリの読み込みで失敗していることが分かりました。
「4. .pyプログラムに記載されているもののうち、必要なライブラリをインストールする」で、ライブラリのインストールは完了していたため、PyInstallerでexe化する際に何らかの失敗しているのだと考えました。
そこで、ChatGPT3.5にエラー内容とその解消方法を質問したところ、.specを編集する方法を案内されました。内容は以下の通りです。
- PyInstallerのオプションに「--hidden-import」を設定
- .specを編集し、hiddenimportsにライブラリを記載する
しかし、案内された方法で生成したexeは、同じライブラリ読み込み失敗エラーとなりました。
まず前提として、ChatGPTでプログラムを書いていました。そのため、プログラムに関する質問はChatGPTに質問する形で修正していました。
しかし何度聞いても上記以外の回答は得られず、結局ググって「--collect-date」が最適だとわかりました。
参考サイト
ありがとうございました!