Open8

MacでNuitkaを使ってPythonアプリを配布できるようにするメモ

ピン留めされたアイテム
kiyukiyu

Mac OS M1 chipでNuitka実行する際の注意 & Tips

環境構築

  • pyenvは非対応
    It is known that Windows app store Python definitely does not work, it's checked against. And on macOS "pyenv" likely does not work.
    https://github.com/Nuitka/Nuitka

  • conda は自分の環境が悪いかのか、うまくいかなかった

  • venv で環境構築したらうまくいった

$ python3 -m venv env
$ source env/bin/activate
$ pip install nuitka zstandard orderedset

orderedsetでビルドが高速化される。
nuitkaでonefileオプション使用時にzstandardが必要。

Qt使用で躓いたところ

Nuitkaで一部のモジュールを使用する際にはプラグインを有効化する必要がある。
python -m nuitka --plugin-list で一覧を確認可能。
Qt関連のモジュールでPyQt5PySide2 に関しては、一部のみ対応のため、PySide6の使用が推奨されている。
https://www.nuitka.net/pages/pyside2.html
https://www.nuitka.net/pages/pyqt5.html

ファイルのインクルード

.txtファイルや.jsonファイル等を読み込む場合、明示的にインクルードする必要がある。
例えば、以下のようにjsonファイルを読み込むコードがあった場合、

import os
file_path = "./template/Data/---/settings.json"
with open(file_path) as f:
    s = f.read()
    print(s)

例えば、以下のようにjsonファイルを読み込むコードがあった場合、--onefile オプションでビルドする際は、ファイルを読み込めるようにfile_path = os.path.join(os.path.dirname(__file__), file_path) の行を追加する必要がある。

import os
file_path = "./template/Data/---/settings.json"
file_path = os.path.join(os.path.dirname(__file__), file_path) 
with open(file_path) as f:
    s = f.read()
    print(s)

https://nuitka.net/doc/user-manual.html#onefile-finding-files

また、ビルドの際には、--include-data-dir="./template/Data=template/Data" のようにコピーするフォルダまたはファイルを明示的に指定する。

そのほか

VSCodeのターミナルでパスに日本語が入ったファイルをビルドする際にFATAL: Error, call to 'codesign' failed: というエラーが出た。Mac標準ターミナルで実行すると治るので、VSCodeのターミナルでの問題かもしれない。

結論

$ python -m nuitka --follow-imports --enable-plugin=pyside6 --standalone --onefile --macos-create-app-bundle --include-data-dir="./template/Data=template/Data" --output-dir=Build build_test.py

--follow-importsで、自動的にモジュールをインポートしてビルドしてくれる。
--standaloneで、Pythonをインストールしていないマシーンでも実行可能なビルドファイルが作れる
--onefileで、アウトプットを1ファイルにまとめてくれる。
--include-data-dirで、使用するフォルダをビルドに含める。
--macos-create-app-bundle で、macで実行可能な.appファルを作成可能。
--output-dirで、出力先フォルダを指定。

Reference

公式: Nuitka
公式ドキュメント: Nuitka User Manual
日本語のわかりやすい記事: PyInstaller より圧倒的に優れている Nuitka の使い方とハマったポイント
参考になる記事: Nuitkaで失敗しやすいポイントを解説
日本語の詳しい記事:Nuitkaを使ってスクリプトをバイナリ化してみよう

kiyukiyu

PythonをMacで実行可能なapp化する際には、Pyinstaller等のツールがあるが、Nuitkaが良いという噂を聞いたので試してみる。

kiyukiyu

condaで実行すると以下のエラーが発生する。condaでやらないほうがいいかもしれない

Undefined symbols for architecture arm64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture arm64