2017年9月21日木曜日

PyInstallerでKivyのEXEアプリを作成

***以前書いたアメブロの記事から***

WindowsでKivyのアプリをパッケージ(EXEファイル)にする手順はKivyのドキュメンテーションを見れば何とかなると思いますが、
一つのEXEファイルにまとめるためには少し工夫が必要です。
一つのEXEファイルにまとめるとき、PyInstallerはファイルを一つに圧縮して、
起動するとき、Tempディレクトリに展開します。
その時、必要なファイルが見つからないのが多いです。
そのTempディレクトリは環境変数で保存されています。

まず、必要なデータファイルはどこに保存されているか、
正しいパスを得るために、スクリプト内にこの関数が必要です。
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)


使い方はこれ。
例えば、アイコンを使うとき、
        self.icon = "icon.png"
ではなく、
        self.icon = resource_path("icon.png")
でアイコンのパスを得ます。

次に、実際にPyInstallerを使うとき、
必要なファイルを--add-dataというオプションで追加します。
例えば、
 pyinstaller -F -w --icon icon.ico --add-data "icon.png;." myapp.py

これでPyInstallerは一回起動しますが、おそらく出来上がりのEXEファイルは実行できません。
なぜかというと、Kivyに必要なインポートはされていませんから。
そこで、specファイルを編集する必要があります。
実際の手順はKivyのドキュメンテーションにありますが、
簡単に言うと、specファイルの冒頭に
 from kivy.deps import sdl2, glew
を入れて、COLLECT()のところのa.datasのすぐあとに
 *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]
を入れます。

この感じになります。
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
               strip=False,
               upx=True,
               name='myapp')


これができたら、再度PyInstallerを実行します。
 pyinstaller myapp.spec
これでdistというサブディレクトリのEXEファイルが動くはずです。
やってみてください✌

0 件のコメント:

コメントを投稿