0

py2app を使用して pygame アプリをバンドルしています。バンドルは機能し、結果のバンドルは私の Mac で問題なく動作します。また、別の人のMacでも問題なく実行されていました。ただし、最近、彼のコンピューターでバンドルを実行しようとすると、(コンソールから) 次のエラーが発生するようになりました。

Traceback (most recent call last):
  File "/Users/.../tmp/withconsole.app/Contents/Resources/__boot__.py", line 316, in <module>
    _run()
  File "/Users/.../tmp/withconsole.app/Contents/Resources/__boot__.py", line 311, in _run
    exec(compile(source, path, 'exec'), globals(), globals())
  File "/Users/.../tmp/withconsole.app/Contents/Resources/withconsole.py", line 18, in <module>
pdb.set_trace()
  File "bdb.pyc", line 53, in trace_dispatch
  File "bdb.pyc", line 88, in dispatch_return
  File "pdb.pyc", line 190, in user_return
  File "pdb.pyc", line 210, in interaction
  File "cmd.pyc", line 142, in cmdloop
  File "pdb.pyc", line 279, in onecmd
  File "cmd.pyc", line 218, in onecmd
  File "pygame/macosx.pyc", line 10, in <module>
  File "pygame/sdlmain_osx.pyc", line 14, in <module>
  File "pygame/sdlmain_osx.pyc", line 10, in __load
ImportError: dlopen(/Users/.../tmp/withconsole.app/Contents/Resources/lib/python2.7/lib-dynload/pygame/sdlmain_osx.so, 2): Symbol not found: _OBJC_CLASS_$_NSObject
  Referenced from: /Users/.../tmp/withconsole.app/Contents/Resources/lib/python2.7/lib-dynload/pygame/sdlmain_osx.so
  Expected in: /usr/lib/libobjc.A.dylib
 in /Users/.../tmp/withconsole.app/Contents/Resources/lib/python2.7/lib-dynload/pygame/sdlmain_osx.so
2013-11-09 06:19:50.794 withconsole[2797:1c03] ogclient Error

以前は機能していた古いバンドルを実行してみましたが、今では機能しなくなりました! とにかく、私はそれについて95%確信しています。

いずれにせよ、何が問題で、どうすれば修正できますか?

4

1 に答える 1

2

py2app のスタンドアロン アプリは、py2app に使用する Python のバージョンに関係なく、組み込みの Python インタープリターを作成します。

たとえば、OS X 10.6 以降で実行するようにビルドされた Python を使用する場合、アプリケーションは (10.6 以降の機能を使用しない限り) OS X 10.6 以降でも実行されます。特定の 10.8 マシンで実行するようにビルドされた Python を使用する場合、アプリケーションは 10.8 より前のマシンでは動作しない可能性が非常に高く、他の 10.8 以降のマシンでも動作しない可能性があります。

その上、自分でビルドした C ライブラリに対してビルドした C 拡張モジュールを使用している場合、それらの C ライブラリが特定のマシン用にビルドされている場合、おそらく同じ問題が発生します。

Homebrew を使用して Python インタープリターを作成しました。そして、おそらくあなたのSDLもそうpygameです。そしておそらく他のもの。デフォルトでは、Homebrew はすべてを特定のマシンで実行するようにビルドし、再配布可能にしないようにします。したがって、問題。

10.7 マシンで実行できるアプリをビルドするには、10.7 SDK に対して Python、SDL などをビルドするか、それ以降の API に対してビルドして を指定する必要があります-mmacosx-version-min=10.7。(他にもいくつか問題が発生する可能性がありますが、どれも CPython に影響を与えないと確信しているので、単純にしておきましょう。)

これにより、ビルドするすべての C 拡張モジュールが同じ SDK およびバージョン設定を使用するように自動的に設定されるため、それらについて心配する必要はありません。ただし、これらの拡張モジュールが依存する、作成した C ライブラリについて心配する必要がありますたとえば、pygameに対するリンクはlibSDL、ローカル マシン用にのみ SDL をビルドした場合、pygame他の誰かのマシンでは機能しません。

Homebrew で SDK ビルドを作成することは可能ですが、必ずしもそう簡単ではありません。Python を手動でビルドして適切な--configureフラグを渡す方が簡単です。しかし、他の誰かが移植性のために既にビルドしたバイナリを取得して使用する方が簡単です。

python.org にある公式の Python インストーラーは、10.6 以降用にビルドされています。公式の SDL 開発ライブラリは、10.5 以降用に構築されています。うまくいけば、あなたが依存している他のものにも同じことが当てはまります。もしそうなら、単にbrew uninstall(または、用心深く、後でこれを元に戻したい場合はbrew unlink)すべて、バイナリインストーラーを実行し、新しい Python に必要なすべての Python モジュールを再インストールし、py2app を使用します。


私はこれをすべて一般的な言葉で書きました。出力から、友人の特定の 10.7 マシンでのこの特定の実行で発生している特定の問題は、SDL ラッパーが 10.7 には存在しなかった ObjC ランタイムの機能に依存していることのようです。したがって、10.7 対応の SDL と既存の Python を使用するだけで十分である可能性があります。しかし、可能であれば、すべて 10.7 対応のものを使用する方がよいと思います。


SDK が正確に何をするのか知りたい場合は、Apple の公式ドキュメントのSDK 互換性ガイドで技術的な側面がかなり詳しく説明されています。また、このような実用的な部分を説明する無数のブログ投稿がありますが、私は試してみます要約します。

各 SDK は、独自の /usr/include、/usr/lib、/System/Library/Frameworks、およびその他のいくつかを内部に持つ単なるディレクトリです。SDK に対してビルドすると、システムの代わりにそのヘッダー ファイルに対してコンパイルし、システムの代わりにその dylib に対してリンクすることになります。これにより、10.6 以降に追加された新機能を使用できなくなります (成功したビルドがユーザーのマシンの半分で起動しない代わりに、適切なコンパイラ エラーが発生します)。また、そのような新機能を使用しない場合でも、10.6 には存在しなかったものに対するロード時の依存関係がプログラムにないことが保証されます。

于 2013-11-08T23:49:59.950 に答える