
マイケル
みなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
クマ〜〜〜〜

マイケル
今日はPythonファイルをexe、app化する方法について紹介するよ!

エレキベア
そんな方法があったクマね

マイケル
Pythonスクリプトをexe化するライブラリとしては
・Pyinstaller
・cx_Freeze
が有名だけど、今回は動作が速いが情報が少ない
と言われる cx_Freeze を使ってみます!
・Pyinstaller
・cx_Freeze
が有名だけど、今回は動作が速いが情報が少ない
と言われる cx_Freeze を使ってみます!

エレキベア
英語で読めないクマ・・・

マイケル
とりあえず触っていこう!
cx_Freezeのインストール

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

マイケル
インストールができたら早速使っていきましょう!
まずは下記のシンプルなクリッカーアプリをexe化してみます!
まずは下記のシンプルなクリッカーアプリを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という設定ファイルを記述する必要があります。
書き方は下記の公式ドキュメントを参照しましょう!
書き方は下記の公式ドキュメントを参照しましょう!

エレキベア
いろんなオプションがあるクマね
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 コマンドを実行しましょう!
python setup.py build コマンドを実行しましょう!
// EXEファイルの作成
python setup.py build

マイケル
実行するとディレクトリにbuildフォルダが作成され、
その中にexeファイルが出力されます。
その中にexeファイルが出力されます。

↑exeファイルが出力される

エレキベア
これだけで出力されるクマか

マイケル
実行しても下記のように正常に起動するかと思います!

↑exeファイル実行結果
Mac

マイケル
同じようにappファイルも作成してみましょう!
setup.pyについてはWindowsと同様になります。
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ファイルとしてまとめる 処理を流れで行ってくれます。
// APPファイルの作成
python setup.py bdist_mac

マイケル
実行すると、こちらもbuildフォルダ配下にappファイルが作成されていることが分かります。



マイケル
実行しても正常に動かすことができました!

エレキベア
ちょろいクマ〜〜〜
パズルゲームのexe、app化

マイケル
シンプルなクリッカーアプリで試してみましたが、
今度はもう少し複雑なアプリをexe化してみましょう!
今度はもう少し複雑なアプリをexe化してみましょう!

マイケル
というわけで、以前作ったPythonのパズルゲームをexe化してみようと思います。

エレキベア
(なつかしいのを出してきたクマ・・・。)
Windows

マイケル
とはいえ、setup.pyの記述は基本的にはクリッカーアプリと同じになります。
しかし今回は画像ファイルを読み込む必要があるため、include_filesに画像ファイルのフォルダを指定 することで画像ファイルも同梱しています。
しかし今回は画像ファイルを読み込む必要があるため、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フォルダも同梱されることが確認できます。
Exeファイルのディレクトリにimagesフォルダも同梱されることが確認できます。

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

マイケル
exeファイルを実行すると、正常に起動することができました!


エレキベア
やったクマ〜〜〜
Mac

マイケル
Macのsetup.pyも同じように作成します。
include_filesに画像ファイルパスを指定しましょう!
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」拡張子のものを用意して指定しましょう!
appファイル作成はbdist_mac_optionsオプションで指定することができます。
※手抜きのためアイコンはpngファイルを指定していますが、本来は「.icns」拡張子のものを用意して指定しましょう!

マイケル
この状態で python setup.py bdist_mac コマンドを実行すると、appファイルが作成されます。


エレキベア
imagesフォルダはどこにあるクマ??

マイケル
いいところに気がついたね!
Includeされたフォルダは、下記のように「~.app/Contents/MacOS」の中に格納されているよ!
Appファイルはこのように実行ファイル等を同梱しているんだね。
Includeされたフォルダは、下記のように「~.app/Contents/MacOS」の中に格納されているよ!
Appファイルはこのように実行ファイル等を同梱しているんだね。

↑appファイルの中に同梱される

マイケル
実行もこのようにうまくいきました!


エレキベア
だいぶ分かってきたクマ〜〜〜
おわりに

マイケル
というわけで今回はcx_Freezeを使ってみました!
どうだったかな?
どうだったかな?

エレキベア
思ったより手軽にexeファイル化できて感心したクマ

マイケル
今回の例は簡単だったけど、使用するライブラリが増えてくると、
setup.pyの内容も複雑になってくるかと思います!
そういった深いところは地道にエラーログを見ながら対処していくしかなさそうだね・・・
setup.pyの内容も複雑になってくるかと思います!
そういった深いところは地道にエラーログを見ながら対処していくしかなさそうだね・・・

エレキベア
本当の勝負はこれからクマね・・・

マイケル
とはいえ作ったツールをちゃんとexe、app化できると気持ちいいね!
これから積極的に使っていこう!
これから積極的に使っていこう!

マイケル
それでは今日はこの辺で!
アデュー!!
アデュー!!

エレキベア
クマ〜〜〜〜〜
【Python】Pythonスクリプトをexe、app化する【cx_Breeze】 〜完〜
コメント