4

回帰と単体テストを実行するために Python にエクスポートしたい C++ で記述された dll があります (Python で回帰を維持して実行する方が簡単です)。この目的のために、Boost.Python を使用して dll のメイン API をエクスポートし、Python で使用できるようにします。私のアセンブリは次のようになります。

  1. MyLibrary.dll //メイン API C++ ライブラリ
  2. MyLibrary.pyd //エクスポート定義のみを含むシン dll プロジェクトBOOST_PYTHON_MODULE(MyLibrary.dll に依存)
  3. ... //MyLibrary.dll が依存する他の C++ dll ファイル

MyLibrary.pyd をリンクするのに苦労しましたが、質問を少し掘り下げた後 (例:ここb2.exe) 、特定の Python バージョンを指している間にブーストを再構築する必要があることに気付きました。その後、Pythonからライブラリをインポートして実行することができました(私のマシンだけで)。

技術データ: Windows 7 x64 および MSVC-10.0 でブースト 1.51、Python 3.23 を使用してライブラリを構築しています (自分のプロジェクトは VS2010 から構築されています)。ブーストとのリンクに使用しているバリアントは、共有ライブラリ、64 アドレス モデルであり、それに応じて自分のビルドでリリースされます。

問題は、別のマシンにライブラリ (自分のマシンでビルド) をインポートしようとすると、python が不平を言うことです:

ImportError: DLL load failed: The specified procedure could not be found.

オンラインでimport MyLibrary

これは、次の疑問を投げかけます。

  1. 私のマシンでビルドした MyLibrary.pyd は「python-portable」ですか? つまり、3.23 (自分のマシンで boost.python をビルドするために使用したバージョン) 以外の Python の他のバージョンでも動作しますか?
  2. MyLibrary.pyd のユーザーは、正常にインポートできるようにするために、独自のバージョンの Python でブーストを再構築する必要がありますか?
  3. これまでのところ、BoostPro が提供する Windows 用のビルド済みブースト インストーラーを使用してきました。チーム全体で Python の「正しい」バージョン (BoostPro がリンクされているバージョン) を使用することを決定した場合、ビルドがリンクされている Python のバージョンは何ですか?
4

1 に答える 1

3

http://docs.python.org/3.2/whatsnew/3.2.htmlでPEP384を見てください。

http://www.boost.org/doc/libs/1_52_0/libs/python/doc/news.htmlは、最近実際の進歩がないことを示しているので、Boost.Pythonがサポートしているか、少なくともテストされているとは思えません。 Py_LIMITED_APIが定義されています。

Boost.PythonとPyCXXの両方を使用したPython2.xの互換性に関する私の経験によると(私はまだ3.xラインを使用していません):

  1. いいえ、そうではありません。マイクロバージョンの変更のみがABIポータブルのままです。
  2. ではない正確に。提供されたMyLibrary.pydバイナリのユーザーは、異なるメジャー/マイナーPythonバージョンを使用してそれをロードすることはできません。彼女が持っているBoostのビルド構成は重要ではありません。サポートするすべてのマイナーPythonバージョンでBoost.Pythonビルドを作成する必要があります。これには、32ビットと64ビットのPythonインストール用の個別のビルドが含まれます。

私のアドバイスは、Py_LIMITED_APIが定義されたソースからBoostをビルドすることです。成功することを保証するものではありませんが、試してみる価値はあります。

それが失敗した場合は、チームメートにあなたと同じPythonバージョンともちろんx64ビットWindowsを使用するように依頼してください(.pyd自体は64ビットであるため)。または、クライアントが適切なバイナリを選択できるように、必要なすべての構成でPythonモジュールをビルドするCIマシンをさらに適切にセットアップします。チームメイトに、ローカルでのみ使用するために独自のバージョンのMyLibrary.pydを作成して使用させます。

于 2012-11-06T23:41:25.983 に答える