Python

py2appは今のところ使わない方が良い?

2021年10月11日

py2appは使わない方が良い?

試しにインストールしてみましたが、Macで動きませんでした。

原因を追えば追うほど、エラーが増えていき時間の無駄です。

この記事ではpy2appのインストールから動かない原因までを解説しています。

py2appのモジュールを導入することを検討している方は、PyInstallerあたりが無難だと思います。

py2appとは

py2appとは

py2appとは、Pythonコードからアプリケーションを作成することができます。

基本的にはPythonのsetuptoolsコマンドで、Windows用だとpy2exeでpy2appはMac版になります。

しかし、マルチデバイス対応とのことで、各インストーラーを作成することが可能です。

py2appをインストール

py2appをインストールするには、pipコマンドを利用します。

他にもソースからもできますが、今回はpipの方法になります。

$ pip install py2app

py2exeをインストールした時にMacではエラーになりました。

Windowsでも一応インストールできるか確認してみます。

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でエラーが発生している(他の要因もありそう)。

これらのエラーを解決するより、他のモジュール入れた方が時間の無駄にならない気がする。

Udemyへ

今後の人生を豊かにする為にキャリアアップのステップとして、自分への投資をしてみませんか?

-Python
-,