技術は使ってなんぼ

自分が得たものを誰かの役に立てたい

pyinstallerで公園検索WEBアプリを配布できるようにしてみた。


こんにちは。

今回は前回作成したWEBアプリを、pyinstallerを使って配布できるようにしてみようと思います。

前回の記事はこちら。

yonesuke0716.hatenablog.com

pyinstallerはPythonで作ったアプリをexeファイルとして生成することで、Pythonの開発環境が入ってないPCでも実行できるようになります。

pyinstallerの手順を追って、実際にexeファイル化するところまで紹介します。

作成したexeファイルはgit上にアップロードしておくので、この記事の最後の方に飛んでgitからダウンロードしてください。

それではよろしくお願いします。

pyinstallerの準備

仮想環境の作成

pyinstallerでexeファイルを作成する際は、仮想環境を立ち上げて作成することをおススメします。

これはなぜかというと、pyinstallerで作成する際の実行環境の中に入ってるライブラリを全て含めてしまうからです。

使わないライブラリが含まれている実行環境でexe化すると、容量が大きなexeファイルができてしまいます。

なので仮想環境を作成し、必要最低限のライブラリで作ることで容量を抑えたexeファイルを作るようにしましょう。

仮想環境はvenvでもpyenvでもなんでもいいですが、今回は私が個人的に好きなminicondaを使います。

Anacondaではありません、minicondaです。

この理由としては、2つほどあって、

・Anacondaは商用利用できない
→もしも事業等で活用する際は使えない(もしくは有償で利用する)
・Anacondaは必要以上に機能が多い
→exeファイルを少しでも軽くしたい

minicondaであれば無償利用できますし、Anacondaと基本は同じですが、必要最低限で軽量です。

minicondaをまだインストールしてない方はこちらからインストールしてください。
docs.conda.io

お使いのosにあったものをご利用ください。

Pythonのverは3.9を使います。

インストールが完了しましたら、さっそく仮想環境を作成します。

Anaconda prompt(miniconda3)を立ち上げて、まずはsearch_parkがあるフォルダまでcdしましょう。

以下のコマンドを入力します。

$ conda create -n search_park

search_parkの部分が仮想環境名になるので、自由に変更してもらって構いません。

作成できたら、

$ conda activate search_park

で仮想環境を立ち上げます。

成功するとコマンドの先頭が(search_park)となります。

この仮想環境に必要なライブラリをインストールしましょう。

$ pip install streamlit pandas openpyxl pyinstaller

これで仮想環境の作成は完了です。

ターミナルはcdでtest.pyが保存されているフォルダに移動しておきましょう。

pyinstallerでexeファイルの作成

main.pyの作成

streamlitを実行するためには、通常のpython ***.pyみたいなコマンドではなく、streamlit run ***.pyのようなコマンドになります。

このままexeファイルをpyinstallerで生成しても、streamlitが実行できないので、スクリプトからコマンドが打てるようにしたいと思います。

そのために、main.pyというスクリプトを作成します。

import subprocess

if __name__ == "__main__":
    cmd = "streamlit run test.py"
    subprocess.run(cmd, shell=True)

これでmain.pyが実行されれば、test.pyのstreamlitを起動することができます。

main.specの作成、設定

ではさっそくpyinstallerでexeファイルの準備をしていきます。

test.pyに移動したターミナルで、以下のコマンドを打ちます。

$ pyinstaller main.py

以下のようにメッセージが表示されれば成功です。

Building COLLECT COLLECT-00.toc completed successfully.

成功すると、buildフォルダとdistフォルダとmain.specというファイルが生成されていると思います。

main.specを開いて、datas=[] の部分を以下のように修正してください。

main.spec

生成したexeファイルはmain.pyに関するものだけで、外部ファイルを含んでおりません。

なので普通に生成すると、main.py以外のものは生成されないので、exeを実行してもエラーが発生します。

main.specのdatasに追加することで、test.pyやtest.xlsxもexeと同じ階層に生成してくれます。

普通に手動でコピーでもOKです。

それでは以下のコマンドを入力しましょう。

$ pyinstaller main.spec

実行すると、「ALL ITS CONTENTS will be REMOVED! Continue?」って聞かれるのでyを押してEnterしましょう。

成功するとdist/testフォルダの中身にexeファイルとxlsxファイルが生成されていればOKです。

exe動作確認

それではターミナルは全て閉じて、純粋にmain.exeファイルをダブルクリックしてみましょう。

成功!

無事起動しました。

私のPCにstreamlitはインストールされてません。

dist内のmainフォルダを渡すだけで、Pythonの開発環境がないPCでも公園検索アプリを立ち上げることができるようになりました。

こちらはgitにアップロードしておくので、ご自由にご利用ください。

github.com

おまけ(exeファイルにまとめる)

フォルダ内にいっぱいファイルがあって、exeだけで持ち歩きたい。

そんな時は

$ pyinstaller main.spec

これを

$ pyinstaller --onefile main.py

としてください。

するとdist内にmain.exeだけ生成されます。

ただし、これだけだとtest.pyとtest.xlsxを読み込めないので、同じ階層にコピーしてください。

onefile

これでこの3つのファイルを持ち歩くだけでOKです。

フォルダ全部の時と比べてすっきりしますが、若干動作が遅くなるので、より高速で実行したい方はフォルダで使いましょう。

おまけのおまけ(おすすめ図書)

私のディープラーニングの教科書ともいうべきシリーズです。

ディープラーニングについて仕組みからしっかり理解した方におすすめです。

最新刊は強化学習がテーマでした。

強化学習ってなんだかわかりにくいですが、この本は数式や実装で示してくれるのでわかりやすかったです。