0

py2app で正常に動作している中規模の PyQT5 デスクトップ アプリケーションがあります。アプリが自分自身を更新できるように Esky を組み込みたいのですが、起動時に (メイン ウィンドウを表示する前に) アプリが終了し、"HelloApp エラー" というログ エントリが表示されます ("HelloApp" はアプリケーションの名前です)。

https://github.com/markmont/esky-package-questionで入手できる問題を再現する小さなテスト ケースを作成しました。

テスト ケース アプリの構造は次のとおりです。

HelloApp/
    HelloApp/
        HelloApp.py
        helloform
            __init__.py
    setup.py

setup.py には以下が含まれます。

from esky import bdist_esky
from distutils.core import setup

PY2APP_OPTIONS = {
    'argv_emulation': True,
    'includes': [ 'sip', 'PyQt5', 'helloform' ],
    'qt_plugins': [ '*' ]
    }
ESKY_OPTIONS = {
    "freezer_module": "py2app",
    "freezer_options": PY2APP_OPTIONS,
    "includes": [ 'sip', 'PyQt5', 'helloform' ]
    }
HelloApp = bdist_esky.Executable( "HelloApp/HelloApp.py", gui_only=True )

setup(
    name='HelloApp',
    version = "2014060301",
    data_files=[],
    options = { "bdist_esky": ESKY_OPTIONS },
    scripts=[ HelloApp ]
)

HelloApp.py にはステートメントが含まれています。これが、アプリケーションが起動するステートメントを削除して helloform/ init .py のfrom helloform import Form内容に貼り付けたかのように、「HelloApp エラー」というエラーでアプリの起動に失敗する原因のようです。正しく動作します。

また、すべてを単一のディレクトリに移動し、setup.py のパスを調整すると、問題は発生しません。Esky が helloform.py (以前は helloform/ init .py という名前) を見つけてインクルードし、アプリケーションが起動します。そして正しく動作します:

HelloApp/
    HelloApp.py
    helloform.py  # formerly ./HelloApp/helloform/__init__.py
    setup.py

...しかし、すべてを単一のディレクトリに配置することは、中規模から大規模のアプリケーションにとってスケーラブルなソリューションではありません。

問題が発生したときの出力にエラー メッセージはありませpython setup.py bdist_eskyん。また、Esky のドキュメントや Web 上のさまざまな例で答えを見つけることができませんでした。

/var/log/system.log からの完全なエラーは次のとおりです。

2014-06-03 13:03:07.100 HelloApp[14968]: HelloApp Error

setup.py でEsky のincludesオプションを適切に使用していないと思いますが、これを修正する方法についての手がかりがありません。誰か助けてもらえますか?

その他の関連する可能性のある詳細: MacOS X 10.9 Mavericks、Python 2.7.6 (ローカル ビルド)、qt-5.3.0 オープンソース、sip 4.16、PyQT 5.3.0 (GPL)、PyQT5をサポートするようにパッチが適用されたpy2app 0.8.1 、および最新バージョンGitHub からの Esky の。

前もって感謝します!

4

1 に答える 1

0

私はこの問題を解決しました -- この問題は、Python distutils と setuptools に関する私の限られた知識が原因でした。py2app (setuptools を使用していた) で「問題なく動作した」ので、実際には distutils の使用方法に問題があるのに、Etsy の構成方法に問題があると思いました。

問題は、凍結されたアプリに helloworld.py がコピーされていないことでした。

この解決策には、ファイルを再構築し、disutils 構成を変更して HelloApp をパッケージとして明示的に追加することが含まれていました。

新しいファイル構造:

HelloApp/
    hello.py   # formerly HelloApp.py
    HelloApp/
        __init__.py
        helloform.py
    setup.py

新しい setup.cfg:

from esky import bdist_esky
from distutils.core import setup

PY2APP_OPTIONS = {
    'argv_emulation': True,
    'includes': [ 'sip', 'PyQt5' ],
    'qt_plugins': [ '*' ]
    }
ESKY_OPTIONS = {
    "freezer_module": "py2app",
    "freezer_options": PY2APP_OPTIONS,
    "includes": [ 'sip', 'PyQt5' ]
    }

HelloApp = bdist_esky.Executable( "hello.py", gui_only=True )

setup(
    name='hello',
    version = "2014060301",
    data_files=[],
    options = { "bdist_esky": ESKY_OPTIONS },
    scripts=[ HelloApp ],
    packages=[ 'HelloApp' ],
)
于 2014-06-04T02:25:01.410 に答える