Pythonで配布可能な実行ファイルを作成する際に有効な手段としてcx_Freezeがある。
少し前に下記のポストでも書いたが、似た選択肢としてはpyinstallerがあるが、こちらはライセンスがGPLなので、例えば商用で利用するようなケースでは厳しくなってくる。
その点、cx_FreezeはPython Software Foundation License となっているので、GPLよりは扱いやすい。
目次
このポストは少々長いため、まずは目次をこちらに記載する。
- 目次
- M1 MacBook Airだとcx_Freezeのインストールが失敗する(ld: library not found for -lintl)
- GitHubでissueを立てたところ、作者の方が相談に乗ってくれた
- M1 MacBook Airでcx_Freezeのインストールを行い、配布可能な実行ファイルを作成するまでのメモ
M1 MacBook Airだとcx_Freezeのインストールが失敗する(ld: library not found for -lintl)
ところでM1 MacBook Airでcx_Freezeのインストールを試したところ、下記のようなエラーが出て失敗してしまった。
環境は pyenvで構築したPython 3.10.1
である。
インストール時のコマンド
pip install --upgrade cx_Freeze
エラーのメッセージを一部抜粋。
ld: library not found for -lintl clang: error: linker command failed with exit code 1 (use -v to see invocation) error: command '/usr/bin/clang' failed with exit code 1
intel MacBook Proだとcx_Freezeのインストールは問題なさそう
intelチップのMacBook Proで同様の環境( pyenv経由で構築したPython 3.10.1
)を再現し、こちらでインストールしたところ、intelチップのmacでは問題なくcx_Freezeのインストールは完了した。
実行ファイルを作成し、下記のtkinterのサンプルアプリケーションが動くところまで確認している。
cx_Freeze/cx_Freeze/samples/Tkinter at main · marcelotduarte/cx_Freeze · GitHub
GitHubでissueを立てたところ、作者の方が相談に乗ってくれた
エラー内容でググっても私と同じような問題が出なかったことや、同様の問題がGitHubのissueにはなかったようなので、issueを立ててみたところ、作者の方が色々と相談に乗ってくれた。
こちらのissue内でより詳細なエラーログや試行したことの内容はすべて記載されているので、より詳細に内容を知りたい方はissueを参照してください。
M1 MacBook Airでcx_Freezeのインストールを行い、配布可能な実行ファイルを作成するまでのメモ
M1 Macでcx_Freezeを使う際は miniforge
経由でインストールすると動くようだった。
miniforgeを選択した理由
pyenv経由ではminiconda環境を構築することも可能だが、残念ながらminicondaはarm64(m1 mac)には対応していないようだったので、M1でも動く環境であるminiforgeを選択した次第である。
私は今回Python 3.10.1の環境でcx_Freezeを動かしたかったので、下記のようにセットアップをしてcx_Freezeのインストールを行った。
(実際にはまず3.9系のインストールから行うなど他のことも行っているが、そちらについてはissue内のログを参照いただけたらと思います)
# miniforgeのセットアップ pyenv install miniforge3-4.10.3-10 # 指定したディレクトリ内のみでminiforge環境を有効化 pyenv local miniforge3-4.10.3-10 # 仮想環境構築 export SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk conda create -n cx310conda -c conda-forge python=3.10 libpython-static -y conda init zsh source ~/.zshrc conda activate cx310conda # cx_Fre conda install -c conda-forge c-compiler importlib-metadata -y pip install --no-binary :all: --pre cx_Freeze -v
なお、cx_Freezeのページを見ると下記のようなインストール方法も紹介されていたが、
conda install -c conda-forge cx_freeze
私の環境ではこの方法でインストールしようとしても、
PackagesNotFoundError: The following packages are not available from current channels:
というエラーが出てしまい、installできなかったため、上記のやり方でインストールしている。
なお、こちらについては作者の方でconda-forgeにosx-arm64のビルドを登録リクエストしてくれたようなので、そのうち conda-forge
でもインストールが可能になるかもしれない。
というわけで、miniforge
を用いることでm1 macでもcx_Freezeが使えるようになった。
下記のキャプチャは実際にcx_Freezeを使って作成したtkinterのサンプルアプリを実行したところ。
追記: Apple Silicon用のビルドがconda intallを用いたインストールにも対応した
現在はconda install
でもM1(Apple Silicon) Mac用のビルドがダウンロードできるようになった。そのため下記のコマンドでインストールが可能。
conda install -c conda-forge cx_freeze
M1(Apple Silicon) Macでも下記のコマンドでcx_Freezeがインストールできるようになりました。対応に感謝。
— Yuki Shindo (@shinshin86) January 24, 2022
```
conda install -c conda-forge cx_freeze
```
M1環境でも使いたかったので嬉しい。ちなみに今日時点でcx_Freezeの6.10が入ります。
詳細は下記のissueにて。https://t.co/g3mn9kcC92
cx_Freezeを用いてmac環境で配布可能な実行ファイルを作成する方法
次にmac環境で配布可能な実行ファイルを作成する方法だが、これも作者の方に教えてもらったのだが、mac環境で配布可能な実行ファイルを作成する方法は下記のようだ。
python setup.py bdist_mac
https://cx-freeze.readthedocs.io/en/latest/setup_script.html#bdist-mac
これで上に貼ったtkinterのサンプルアプリケーションをcx_Freezeを用いて配布可能な実行ファイルとしてコンパイルすることができた。
作者の方には色々と相談に乗ってくれて感謝である。
以上のようなやり方で、miniforgeを使うことでM1 Macでもcx_Freezeを扱うことができるので、興味ある方はぜひ利用してみてください。