【Python】Pythonスクリプトをexe、app化する【cx_Breeze】

Python
マイケル
マイケル
みなさんこんにちは!
マイケルです!
エレキベア
エレキベア
クマ〜〜〜〜
マイケル
マイケル
今日はPythonファイルをexe、app化する方法について紹介するよ!
エレキベア
エレキベア
そんな方法があったクマね
マイケル
マイケル
Pythonスクリプトをexe化するライブラリとしては

・Pyinstaller
・cx_Freeze

が有名だけど、今回は動作が速いが情報が少ない
と言われる cx_Freeze を使ってみます!

cx_Freeze 公式ドキュメント

エレキベア
エレキベア
英語で読めないクマ・・・
マイケル
マイケル
とりあえず触っていこう!
スポンサーリンク

cx_Freezeのインストール

マイケル
マイケル
まずcx_Freezeのインストールについては簡単で、
下記のようにpipコマンドでインストールするだけですね!
pip install cx_Freeze
↑cx_Freezeのインストール
エレキベア
エレキベア
簡単クマ〜〜〜

クリッカーアプリのexe、app化

マイケル
マイケル
インストールができたら早速使っていきましょう!
まずは下記のシンプルなクリッカーアプリをexe化してみます!
import tkinter as tk
from tkinter import ttk


# クリッカー
class ClickerWindow(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master.geometry("250x250")
        self.master.title("Clicker")
        # ラベル
        self.label = ttk.Label(self.master, text="0", font=("Times New Roman", 80))
        self.label.pack(anchor="center", pady=40)
        # ボタン
        self.button = ttk.Button(self.master, text="CLICK", command=self.click_btn)
        self.button.pack(anchor="center")

    # ボタン押下でインクリメント
    def click_btn(self):
        i = int(self.label["text"]) + 1
        self.label["text"] = str(i)
        self.label.update()


if __name__ == "__main__":
    root = tk.Tk()
    app = ClickerWindow(master=root)
    app.mainloop()

↑クリッカーアプリ
マイケル
マイケル
exe化するには、Pythonスクリプトのディレクトリにsetup.pyという設定ファイルを記述する必要があります。
書き方は下記の公式ドキュメントを参照しましょう!

setup script – cx_Freeze

エレキベア
エレキベア
いろんなオプションがあるクマね

Windows

マイケル
マイケル
exeファイルはWindowsで実行することで作成できます。
マイケル
マイケル
setup.pyの一番シンプルな書き方は下記になります。
今回のアプリは公式ページの記述から、アプリ名と読み込むスクリプト名のみ変更するだけで良さそうです。
import sys
from cx_Freeze import setup, Executable

build_exe_options = {"packages": ["os"], "excludes": []}

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
    name="clicker",
    version="0.1",
    description="My GUI application!",
    options={"build_exe": build_exe_options},
    executables=[Executable("main.py", base=base)]
)
↑setup.pyの記述
マイケル
マイケル
このファイルを作成したディレクトリで
python setup.py build コマンドを実行しましょう!
// EXEファイルの作成 
python setup.py build
マイケル
マイケル
実行するとディレクトリにbuildフォルダが作成され、
その中にexeファイルが出力されます。
20210829 WIN 01
↑exeファイルが出力される
エレキベア
エレキベア
これだけで出力されるクマか
マイケル
マイケル
実行しても下記のように正常に起動するかと思います!
20210829 WIN 02
↑exeファイル実行結果

Mac

マイケル
マイケル
同じようにappファイルも作成してみましょう!
setup.pyについてはWindowsと同様になります。
import sys
from cx_Freeze import setup, Executable

build_exe_options = {
    "packages": ["os"],
    "excludes": [],
}

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
    name="clicker",
    version="0.1",
    description="My GUI application!",
    options={"build_exe": build_exe_options},
    executables=[Executable("main.py", base=base)]
)
マイケル
マイケル
そしてappファイルを作成するコマンドは python setup.py bdist_mac になります。
このコマンドを実行すると、 実行ファイル作成 -> appファイルとしてまとめる 処理を流れで行ってくれます。
// APPファイルの作成
python setup.py bdist_mac
マイケル
マイケル
実行すると、こちらもbuildフォルダ配下にappファイルが作成されていることが分かります。
ScreenShot 2021 08 29 0 49 42
ScreenShot 2021 08 29 0 32 41
マイケル
マイケル
実行しても正常に動かすことができました!
エレキベア
エレキベア
ちょろいクマ〜〜〜

パズルゲームのexe、app化

マイケル
マイケル
シンプルなクリッカーアプリで試してみましたが、
今度はもう少し複雑なアプリをexe化してみましょう!
マイケル
マイケル
というわけで、以前作ったPythonのパズルゲームをexe化してみようと思います。
エレキベア
エレキベア
(なつかしいのを出してきたクマ・・・。)

Windows

マイケル
マイケル
とはいえ、setup.pyの記述は基本的にはクリッカーアプリと同じになります。
しかし今回は画像ファイルを読み込む必要があるため、include_filesに画像ファイルのフォルダを指定 することで画像ファイルも同梱しています。
import sys
from cx_Freeze import setup, Executable

include_files = [
    ('C:\\workspace\\PycharmProjects\\akeomePuzzle\\Resources\\images', '')
]

build_exe_options = {
    "packages": ["os"],
    "excludes": [],
    "include_files": include_files
}

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
    name="akaomePuzzle",
    version="0.1",
    description="My GUI application!",
    options={"build_exe": build_exe_options},
    executables=[Executable("akeomePuzzle.py", base=base)],
)
↑画像ファイルのinclude
マイケル
マイケル
合わせてPythonスクリプトも少し修正します。
画像ファイルを実行ファイルのパスから読み込む必要があるため、下記のようにパスを指定するよう修正しました。
# 画像の取得(実行ファイルからの相対パス)
images_path = os.path.join(os.path.dirname(sys.argv[0]), "images")
bg = tkinter.PhotoImage(file=os.path.join(images_path, "ball_bg.png"))
↑画像読み込みパスの修正
マイケル
マイケル
この状態で python setup.py build を実行すると、
Exeファイルのディレクトリにimagesフォルダも同梱されることが確認できます。
20210829 WIN 03

↑imagesフォルダも同梱される

マイケル
マイケル
exeファイルを実行すると、正常に起動することができました!
20210829 WIN 04
エレキベア
エレキベア
やったクマ〜〜〜

Mac

マイケル
マイケル
Macのsetup.pyも同じように作成します。
include_filesに画像ファイルパスを指定しましょう!
import sys
from cx_Freeze import setup, Executable

include_files = [
    ('/Users/molegoro/workspace/PycharmProjects/games/akeomePuzzleApp/Resources/images', '')
]

build_exe_options = {
    "packages": ["os"],
    "excludes": [],
    "include_files": include_files
}

bdist_mac_options = {
    "iconfile": "/Users/molegoro/workspace/PycharmProjects/games/akeomePuzzleApp/Resources/images/ball_gold.png",
}

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
    name="akaomePuzzle",
    version="0.1",
    description="My GUI application!",
    options={"build_exe": build_exe_options, "bdist_mac": bdist_mac_options},
    executables=[Executable("akeomePuzzle.py", base=base)],
)
↑画像ファイルパスの指定
マイケル
マイケル
今回はついでにアイコンパスを指定してみました。
appファイル作成はbdist_mac_optionsオプションで指定することができます。
※手抜きのためアイコンはpngファイルを指定していますが、本来は「.icns」拡張子のものを用意して指定しましょう!
マイケル
マイケル
この状態で python setup.py bdist_mac コマンドを実行すると、appファイルが作成されます。
ScreenShot 2021 08 29 0 34 09
エレキベア
エレキベア
imagesフォルダはどこにあるクマ??
マイケル
マイケル
いいところに気がついたね!
Includeされたフォルダは、下記のように「~.app/Contents/MacOS」の中に格納されているよ!
Appファイルはこのように実行ファイル等を同梱しているんだね。
ScreenShot 2021 08 29 1 02 54
↑appファイルの中に同梱される
マイケル
マイケル
実行もこのようにうまくいきました!
ScreenShot 2021 08 29 0 34 16
エレキベア
エレキベア
だいぶ分かってきたクマ〜〜〜

おわりに

マイケル
マイケル
というわけで今回はcx_Freezeを使ってみました!
どうだったかな?
エレキベア
エレキベア
思ったより手軽にexeファイル化できて感心したクマ
マイケル
マイケル
今回の例は簡単だったけど、使用するライブラリが増えてくると、
setup.pyの内容も複雑になってくるかと思います!
そういった深いところは地道にエラーログを見ながら対処していくしかなさそうだね・・・
エレキベア
エレキベア
本当の勝負はこれからクマね・・・
マイケル
マイケル
とはいえ作ったツールをちゃんとexe、app化できると気持ちいいね!
これから積極的に使っていこう!
マイケル
マイケル
それでは今日はこの辺で!
アデュー!!
エレキベア
エレキベア
クマ〜〜〜〜〜

【Python】Pythonスクリプトをexe、app化する【cx_Breeze】 〜完〜

コメント