個人的な備忘録。
cx_Freezeを用いたPythonでmacOS用のデスクトップアプリを作る際に調べたあれこれを備忘録的に書き残していく。
なお、Macでcx_Freezeを利用する方法については下記にまとめている。
目次
- 目次
- Mac用の実行ファイルを作る方法。
- Mac用の実行ファイルの構成
- cx_Freezeで静的ファイルをアプリケーション内に格納する場合はinclude_filesオプションを利用する
- アプリケーションのiconを設定する
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
でも問題なくアイコンとして機能している。