試しにインストールしてみましたが、Macで動きませんでした。
原因を追えば追うほど、エラーが増えていき時間の無駄です。
この記事ではpy2appのインストールから動かない原因までを解説しています。
py2appのモジュールを導入することを検討している方は、PyInstallerあたりが無難だと思います。
py2appとは
py2appとは、Pythonコードからアプリケーションを作成することができます。
基本的にはPythonのsetuptoolsコマンドで、Windows用だとpy2exeでpy2appはMac版になります。
しかし、マルチデバイス対応とのことで、各インストーラーを作成することが可能です。
py2appをインストール
py2appをインストールするには、pipコマンドを利用します。
他にもソースからもできますが、今回はpipの方法になります。
$ pip install py2app
py2exeをインストールした時にMacではエラーになりました。
Windowsでも一応インストールできるか確認してみます。
エラーも出ずに普通にインストールすることができました。
ってきりエラーが出ると思っていましたが、問題なくインストールできたので実行の時にWindowsで作れるか試してみます。
Mac用のAppファイルを作って実行
Appファイルを作るために、実行ファイルとSetupファイルを作成します。
実行ファイルとセットアップファイルの作成
今回実行するPythonのスクリプトは下記になります。
print('MacでAppファイルの作成')
次にセットアップファイルを作ります。
下記のコマンドを使うと、カンタンにセットアップファイルを作成することができます。
$ py2applet --make-setup exe_sample.py
setupファイルが既にあった場合は、実行すると書き換えますか的な感じの質問がくるのでYを押してエンターで進みます。
Existing setup.py detected, replace? [Y/n] Y
出来上がったファイルは下記になります。
"""
This is a setup.py script generated by py2applet
Usage:
python setup.py py2app
"""
from setuptools import setup
APP = ['exe_sample.py']
DATA_FILES = []
OPTIONS = {}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
py2exeではconsoleだったのですが、py2appはappとsetup_requiresが必要です。
Appファイルの作成
Appファイルを作成するには、下記のコマンドを使います。
$ python setup.py py2app
デプロイが完了するとbuildディレクトリdistディレクトリが作成されます。
distにAppファイルがあります。
実行
実行するにはファイルを直接実行するか、openコマンドを利用して実行します。
$ open -a ./dist/exe_sample.app
直接実行は下記になります。
$ ./dist/exe_sample.app/Contents/MacOS/exe_sample
表示されませんでした。
問題
表示されなかったので、コンパイル時のログを追ってみました。
すると「Modules not found (unconditional imports):」のエラーが出ていてprintの内容がうまく表示されないっぽい。
Pythonのバージョンかなって思ったのですが、2021年10月現在で使っているPythonが3.9です。
公式では3.10対応したとNotesに書かれていました。
printでconsoleに表示したいだけなのに。
一応、Module not foundの2種類があることがわかりました。
それが下記の2つです。
Modules not found (unconditional imports):
省略
Modules not found (conditional imports):
省略
似たようなエラーで、オプションをつけるとオッケー的な情報を見つけたので試してみた。
下記がそれ。
$ python setup.py myapp --packages=PIL
実行すると下記のエラーが出る。
・・・省略
File "/Users/ユーザ名/venv/lib/python3.9/site-packages/py2app/build_app.py", line 1108, in process_recipes
rval = check(self, mf)
File "/Users/ユーザ名/venv/lib/python3.9/site-packages/py2app/recipes/qt6.py", line 22, in check
qtdir = QLibraryInfo.location(QLibraryInfo.LibrariesPath)
AttributeError: type object 'QLibraryInfo' has no attribute 'location'
PyQtのエラーが表示されたので、まずバージョンの問題なのかチェックしてみました。
PyQt6が入っていたので、PyQt5に変更してみましたがダメでした。
もう少し追ってみたら、py2appで使っているqt6.pyの根本がダメっぽい。
ここで使われているPyQt6の書き方が非推奨で推奨の書き方に変更してみた。
# 22行目を修正
# qtdir = QLibraryInfo.location(QLibraryInfo.LibrariesPath)
qtdir = QLibraryInfo.path(QLibraryInfo.LibraryPath.LibrariesPath)
# 34行目を修正
# "resources": [("..", [QLibraryInfo.location(QLibraryInfo.PluginsPath)])]
"resources": [("..", [QLibraryInfo.path(QLibraryInfo.LibraryPath.PluginsPath)])]
これで動けば良かったのですが、さらにModule not foundのモジュールが増えた(笑)
これ以上時間を割くくらいなら、他のモジュール入れた方が良い気がする。
まとめ
py2appは使わない方が良い!
今後はわかりませんが、2021年10月時点では利用しない方が良いです。
py2appのモジュールであるpyqtでエラーが発生している(他の要因もありそう)。
これらのエラーを解決するより、他のモジュール入れた方が時間の無駄にならない気がする。
今後の人生を豊かにする為にキャリアアップのステップとして、自分への投資をしてみませんか?