はじめに
PyInstallerを使用して、PythonのKivyアプリをexe化する方法を示す。
目次
環境
PyInstallerの最新版6.8.0では、exeファイルを終了すると、一時フォルダの削除できないワーニングが発生したため、
バージョン指定で5.13.2を使用する。
- Windows11
- Python 3.11.6
- pip 24.0
- Kivy 2.2.1
- PyInstaller 5.13.2
- PowerShell
フォルダ構成
test
├── main.py # スクリプト
├── main.kv # kivyファイル
├── kivy_venv/Lib/site-packages # 仮想環境にインストールしたモジュール
├── main.spec # PyInstallerの設定ファイル
├── dist/main.exe # 作成するexeファイル
└── build/ # exeファイルに関連するもの(未使用)
手順
1. 仮想環境を構築
python -m venv kivy_venv
2. 仮想環境をアクティブ化
kivy_venv/Scripts/activate
3. Kivyをインストール
pip install kivy
4. PyInstallerをインストール
pip install pyinstaller
5. Pythonのスクリプトを編集
PyInstallerのconsoleオプションを無効にして、exeファイルを作成する場合、exeファイルを実行すると、RecursionErrorが発生する。
そのため、以下の環境変数を設定する。
main.py
if hasattr(sys, "_MEIPASS"):
os.environ["KIVY_NO_CONSOLELOG"] = "1"
6. PyInstallerでexeファイルを作成
- --name (exeファイル名):exeファイル名を指定する
- --onefile:exeファイルを1つにまとめる
- --noconsole:コンソールへの出力を無効にする
pyinstaller main.py --name test --onefile --noconsole
PyInstallerで作成されたspecファイルに以下を追加する。
- from kivy_deps import sdl2, glew :Kivyの設定
- *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)] :Kivyの設定
- datas[("exeファイルから参照したいファイル", "一時フォルダからのファイルの相対パス")]:一時フォルダに保存されるデータ
- C:\Users(ユーザー名)\AppData\Local\Temp_MEIxxxxxx の一時フォルダが作成される
main.spec
# -*- mode: python ; coding: utf-8 -*-
from kivy_deps import sdl2, glew #追加
block_cipher = None
a = Analysis(
['main.py'], #追加
pathex=[],
binaries=[],
datas=[("main.kv", ".")], #追加
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)], #追加
name='test',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False, #出力を無効
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
コンパイルし、再度exeファイルを作成する。
pyinstaller main.spec