今回はKivyによるGUIにてグラフを表示する機能を実装したアプリを配布しようとして、
少し引っかかったので忘備録として。環境はWindows10
1. 必要ライブラリのインポート
matplotlibをKivy内で有効化する為、Kivy-Gardenをインポートする。
後にpyinstallerにてexe化するが、その際にgardenのディレクトリを見失うようなので、
matplotlibは--kivyを使用してインストールする。
$ pip install kivy-garden
$ garden install matplotlib --kivy
2. pyinstallerにてexe化
仮想環境にてpipで必要最低限のライブラリのみインストールする。
(anacondaだったりpyenvだったり仮想環境構築については省略)
不要なものが多いと200~300Mbの巨大exeファイルが誕生する...
$ pip install pyinstaller pypiwin32 #この二つは必須
#こいつらはkivyのインストールについてこないのでインストールが済んでいなければ忘れずに。
$ pip install kivy_deps.sdl2 kivy_deps.glew
$ pip install 必要なライブラリ #pyファイルに必要なライブラリ全て
3. パッケージ化
準備完了です。作業ディレクトリをpythonファイルに移動して以下を実行。
pyinstallerには色々とパッケージングの便利機能がありますがここでは
ファイルを一つにまとめてくれる--onefileを使用。
$ pyinstaller ***.py --onefile
作業ディレクトリに色々と生成されるが、とりあえずdistないにexeファイルが生成。
この状態だとまだGUIは立ち上がらない。
# 作業ディレクトリ内
***.py
***.kv
***.spec
dist
pycache
build
4. specファイルの編集
次にGUIを有効化するためにSPECファイルに依存関係などを記述していく。
#以下specファイル
> ***.spec
from kivy_deps import sdl2, glew # 追加箇所①
block_cipher = None
a = Analysis(['***.py'],
pathex=['c:\\パッケージ化したディレクトリ'],
binaries=[],
datas=[],
hiddenimports=[]
hookspath=[],
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='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True )
# 追加箇所③
coll = COLLECT(exe, Tree('c:\\kivyファイルのディレクトリ'),
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
strip=False,
upx=True,
name='main')
自分の場合は、pythonファイルと同ディレクトリに***.kv用にフォルダ(Layoutなどのフォルダ)を作成して入れてあげた。(あまり意味ないかもだが、collect処理で不要なものも拾わないように)
# 最後に以下を実行
$ pyinstaller ***.spec --onefile
5. 完成
下記のディレクトリにmainフォルダが生成しており、その中に新たなexeファイルが生成している。
この中には依存関係全てのファイルが存在していて、アプリ配布の際にはこのmainフォルダごと
必要になる。(もっと単一化できるとおもう。つーか今の自分にはこれが限界。)
どこかのディレクトリに隠しつつ、exeファイルのショートカットだけ上手いこと使ってもらえれば
それっぽくなると思い妥協した。
dist
|_main # ←この中に新しいexeファイル
|_***.exe
特にmatplotlib==3.1.1を使用したが、最新だとできないような情報も見かけた。
とりあえず、これでGUIアプリケーションを配布可能になった。