MacでNuitkaを使ってPythonアプリを配布できるようにするメモ
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関連のモジュールでPyQt5
と PySide2
に関しては、一部のみ対応のため、PySide6
の使用が推奨されている。
ファイルのインクルード
.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)
また、ビルドの際には、--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を使ってスクリプトをバイナリ化してみよう
PythonをMacで実行可能なapp化する際には、Pyinstaller等のツールがあるが、Nuitkaが良いという噂を聞いたので試してみる。
公式: Nuitka
公式ドキュメント: Nuitka User Manual
日本語のわかりやすい記事: PyInstaller より圧倒的に優れている Nuitka の使い方とハマったポイント
参考になる記事: Nuitkaで失敗しやすいポイントを解説
condaで実行すると以下のエラーが発生する。condaでやらないほうがいいかもしれない
Undefined symbols for architecture arm64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture arm64
このサイトがシンプルでよかった
公式にmacの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.
--macos-create-app-bundle
をつけると、macでappも作ってくれる
M1MacでNiuitkaでビルドしたアプリを実行すると
zsh: segmentation fault
で終了してしまう
クラッシュレポート
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
この症状に近そうだが、うまく解決できず