at backyard

Color my life with the chaos of trouble.

cx_FreezeでmacOS用の実行ファイルを作成する際のあれこれ

個人的な備忘録。

cx_Freezeを用いたPythonmacOS用のデスクトップアプリを作る際に調べたあれこれを備忘録的に書き残していく。

なお、Macでcx_Freezeを利用する方法については下記にまとめている。

shinshin86.hateblo.jp

目次

Mac用の実行ファイルを作る方法。

下記のコマンドで作成可能。

setup.pyが作成されている状態で

python setup.py bdist_mac

Mac用の実行ファイルの構成

作成されたアプリケーションファイルは右クリックして パッケージの内容を表示 とやると、中を見ることが可能。

この中にアプリケーションの実態が格納されている。

基本的に Contents/MacOS/ 内に実行ファイルなどが格納されており、アプリケーションファイルを起動するとこの中の起動ファイルが動く仕組みのよう。

実行ファイル化した場合のPythonのパスの取得方法について

例えばカレントディレクトリを取得する際に os.getcwd() を用いていると、実行ファイル化した場合に想定したパスが取得できずにエラーになる。

解説は省くが、アプリケーションとして起動した場合 os.getcwd() で返ってくるパスが異なってくるため、下記のように条件判定を行ってパスを取得する必要がある。
(たしか、実行ファイル化した場合でもターミナルから直接起動ファイルを叩いた場合はこれに限らなかったような気もするが、そこまで確認はしていない)

def get_current_dir():
    if getattr(sys, "frozen", False):
        return path.dirname(sys.executable)
    else:
        return os.getcwd()

※なお、このコードはこの場でテストもせずに書いたコードなのをご承知おきを。

cx_Freezeで静的ファイルをアプリケーション内に格納する場合はinclude_filesオプションを利用する

cx_Freezeを用いてビルドする際に、アプリケーション内のディレクトリに静的ファイルを格納しておきたい場合がある。

そのようなケースではbuild_exe というオプションに include_files を指定する。

具体的な書き方は下記。

import sys
from cx_Freeze import setup, Executable
・
・
・
include_files = ["{静的ファイルのパス}", "{格納先のパス}"]
・
・
・

setup(
    ・
    ・
    options = {
        "build_exe": {
            ・
            ・
            ・
            "include_files": include_files
        },
    },
    executables = executables,
)

こんな感じで指定できる。

例えば、

include_files = ["./foo.txt", "./foo.txt"]

と指定した場合、ビルド後にfoo.txtが格納される場所は、

Contents/MacOS/foo.txt

となる。

アプリケーションのiconを設定する

cx_Freezeではアプリケーションのiconを設定できるのだが、setup.py に設定する方法だとうまく動かない。

https://cx-freeze.readthedocs.io/en/latest/setup_script.html#cmdoption-arg-iconfile

iconfile をoptionで設定すれば良さそうなのだが、これで実行しても適用されないので、ひとまず下記のように直接コマンド上でアイコンを指定して対応している。
(これについては分かり次第、こちらにもまた記載していく)

python setup.py bdist_mac --iconfile=icon.png

なお、上のコマンドのようにicon自体は .ico ではなく .png でも問題なくアイコンとして機能している。