0

py2app (Mac OS X 10.6) と py2exe (Win XP と Win7) を使用して、python ベースのスタンドアロン アプリケーションを構築しています。最近、ライブラリ patsy に依存する関数のサポートを追加しました。ただし、ソフトウェアの py2app または py2exe バージョンをビルドする場合、patsy の「init .pyc」および「origin.pyc」ファイルのみが site-packages.zip patsy フォルダーに含まれます (20 個の追加の Python モジュール ファイルを除く)。patsy をインポートすると、スタンドアロン アプリが「ImportError: No module named highlevel」というエラーをスローします (highlevel は patsy モジュールです)。

これに対する厄介な回避策は、不足している .pyd モジュールを site-packages.zip の patsy ディレクトリに入れることですが、これは理想的ではありません。py2app コードの簡単な例を示しますが、同じことが py2exe にも当てはまります。

test_import.py

import patsy
print 'hello patsy'

setup.py

includes = ["patsy"]

from distutils.core import setup
import py2app
import patsy
from patsy import highlevel

options = {"py2app":{"includes": includes}}
setup(name='test',app=["test_import.py"],setup_requires=["py2app"])

どんな推奨事項も大歓迎です。ありがとう。

4

1 に答える 1

1

問題は、patsy がメインの名前空間を定義する方法が少し巧妙すぎることです。次の末尾を参照してくださいpatsy/__init__.py

def _reexport(modname):
    __import__(modname)
    mod = sys.modules[modname]
    for var in mod.__all__:
        __all__.append(var)
        globals()[var] = getattr(mod, var)
for child in ["highlevel", "build", "constraint", "contrasts",
              "desc", "design_info", "eval", "origin", "state",
              "user_util", "missing", "splines"]:
    _reexport("patsy." + child)

これにより、コピー/貼り付けコードの重複が回避されますが、py2exe と py2app のどのファイルが使用されているかを判断するためのヒューリスティックが台無しになります。明示的なリテラルの import ステートメントがないため、それらすべてのモジュールが実際にインポートされていることを「見る」ことができません。本当の解決策は、py2exe/py2app が過去 5 年間の Python インフラストラクチャ開発に追いつき、パッケージの setup.py を信頼して必要なものだけをインストールすることです。

当面の間、これは非常に標準的な問題であるため、両方のパッケージに回避策があります。たとえば、py2app の場合、これらは「レシピ」と呼ばれているようです

編集: 代替ソリューション: リリースされたばかりの patsy 0.2.1 を使用して__init__.pyください。

于 2013-08-20T14:16:00.537 に答える