「pyinstaller」で作ったツールを配布しよう!

全般

こんにちはこんばんわ!末端冷え性な気がする、佐々木です!
そして日々、業務効率化や自動化での改善に取り組んでいる皆さんお疲れ様です。

そんな皆さんの中でPythonを利用して改善に取り組んでいる方もいらっしゃるのではないでしょうか?
自分も以前Pythonでちょっとしたツール作っていました。(今も趣味半分でたまに作ります)

しかし、せっかく作ったは良かったものの「使ってもらう方のPCにわざわざPythonをインストールしてあげないと、、」となると、これはめちゃくちゃめんどくさい導入ハードルがぐーーーーーーーーーんっとあがりますね。

というわけで、今回はそんな悩みをサクッと解決できるライブラリ、「pyinstaller」を紹介します。

pyinstaller

pyinstaller/index.rst at fcff15e6e7ab6fad135c584c2b6cc5e0f7809319 · pyinstaller/pyinstaller
Freeze (package) Python programs into stand-alone executables - pyinstaller/index.rst at fcff15e6e7ab6fad135c584c2b6cc5e0f7809319 · pyinstaller/pyinstaller

⭕メリット

  • PythonをインストールしていないPCでも動かせるようになる。
  • コマンドではなく、クリックで起動することができるようになる。

❌デメリット

  • exe化させた実行ファイルのサイズが大きくなりがち(普通に6〜30MBくらいになる)
  • 作成した実行ファイルはOSに依存してしまう。(Windowsで作成した場合はWindows、Macで作成した場合はMac上でのみ動作する)

冒頭のお話しのようなパターンだと、実行ファイル1つ渡せば良いだけですので、ややこしい環境設定も何も必要ないのは、大きいメリットですね。
サイズが大きくなりがちなデメリットに関しては、余計なライブラリを含まないようにすることで多少はリサイズすることが出来ます。(それでも僅かですが)

配布するプログラムを作成する

配布するためのプログラムを作成するに当たり、ちょっとポイントがあります。


1つ目は、仮想環境で作成することです。

作成されたファイルには実行環境となるPythonのライブラリやパッケージが詰め込まれます。
未使用なライブラリやパッケージであっても、容赦なく実行ファイルに含まれてしまうので、仮想環境を作りましょう。(同様の理由でAnacondaなどを使っている方もお気をつけください

2つ目は、入力用の「input」 を記述することです。

作成された実行ファイルを実行させるとシェルが立ち上がります。(一応、このシェルを立ち上げないように設定することも出来ます。)
ですが、プログラム上入力を必要としない場合はシェルはそのまま閉じてしまいます。
入力が不要であればそれでも良いのですが、クリックしたら「いきなりシェルが立ち上がって、すぐ閉じて、、ってなんかめちゃくちゃ怖くない?w」って思うので、上記の「input」を記述することを勧めます。

上記の2つを踏まえてプログラムを書いてみます。

  1. 仮想環境を作成する。
python -m venv .venv

2. 仮想環境に切り替える

  • Windows(PowerShellの場合)
.venv/Scripts/Activate.ps1
  • Mac
source .venv/bin/activate

3. 配布したい内容のプログラムを書く
(結構前に作っていたんですが、githubにあげてなかったのでこのタイミングであげましたw)

## main.py
import psutil
from matplotlib import pyplot
import time


def monitor():
    # Get memory info
    cap_memory = psutil.virtual_memory()
    # Get cpu info
    cpu = psutil.cpu_percent(interval=1)

    return cap_memory, cpu


if __name__ == "__main__":
    input("Press the enter.. ")
    print("start Monitoring...")
    i = 1
    # byte convert
    gb = 1024 * 1024 * 1024
    mem_total_arr = []
    mem_used_arr = []
    mem_free_arr = []
    cpu_used_arr = []
    while i <= 10:
        memory, cpu = monitor()
        print(f"{i}回目----")
        # memory capacity
        print(f"memory capacity > {round(memory.total / gb, 2)}GB")
        mem_total = round(memory.total / gb, 2)
        mem_total_arr.append(mem_total)
        # Used memory volume
        print(f"Used memory > {round(memory.used / gb, 2)}GB")
        mem_used = round(memory.used / gb, 2)
        mem_used_arr.append(mem_used)
        # free memory Volume
        print(f"free memory > {round(memory.available / gb, 2)}GB")
        mem_free = round(memory.available / gb, 2)
        mem_free_arr.append(mem_free)
        # Used cpu activity
        print(f"Used cpu > {cpu}%")
        cpu_used_arr.append(cpu)
        time.sleep(2)
        i += 1
    x = list(range(10))
    fig = pyplot.figure()
    fig_mem = fig.add_subplot(211, title="Used Memory", ylabel="GB")
    fig_mem.plot(x, mem_used_arr, color="r")
    pyplot.grid(ls="--")
    fig_cpu = fig.add_subplot(212, title="Used Cpu", ylabel="%")
    fig_cpu.plot(x, cpu_used_arr, color="g")
    pyplot.grid(ls="--")
    pyplot.show()
    input("exit Press the enter..")

※必要なライブラリなどはgithubにrequirements.txtを置いてますので参考にしてください。

GitHub - daisuke8000/cpuMonitor
Contribute to daisuke8000/cpuMonitor development by creating an account on GitHub.

実行ファイルを作成しよう

では、実際に配布できるように実行ファイルを生成してみたいと思います。

1. インストールを行う。

pip install pyinstaller

2. 実行ファイルを作成する(”–onefile” ・・・ 実行ファイルを単一化させるオプションコマンド
※ここでの「main.py」は実際にプログラムが書かれたpyファイルを指します。

pyinstaller main.py --onefile

3.「dist」というフォルダが同階層に作成され、その中にあるファイルが実行ファイルとなる。

以上、これだけのステップで配布できる実行ファイルが作成されます。
実際に私の方でも上記の手順で作成してみました。作業フォルダが以下のようになっているかと思います。(赤丸の部分)

最後に

如何だったでしょうか?
「作ったはいいけど、使える人は限られちゃうから自己満ツールになっちゃったなぁ、、」
なんて寂しい思いはもうしなくて済みそうですね!
ではまた!

コメント