11

Boost Python ライブラリを使用して、C++ コードに Python 拡張機能を作成しています。以下に示す C++ コードから 'greet' 関数を python から呼び出せるようにしたいと思います。

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>

char const* greet()
{
   return "hello, world";
}

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

そしてpythonコード:

import hello_ext
print hello_ext.greet() 

私は bjam を使用してこれを行うことができました (hello_ext.pyd が生成され、うまく動作します) が、今度は Visual Studio 2008 を使用してビルドしたいと思います。hello.dll がビルドされます (ただし、hello_ext.dll も.pyd)。私のpythonコードを呼び出した後、エラーが発生しました:

ImportError: hello_ext という名前のモジュールがありません。

hello.dll の名前を hello.pyd または hello_ext.pyd に変更した後、別の ImportError: Dll load failed が発生しました

VS 2008 を使用して正しい .pyd ファイルを作成するにはどうすればよいですか?

4

4 に答える 4

10

まず、Python からリリース バージョンのみをインポートするようにしてください。ランタイム ライブラリのバージョンが一致しないため、デバッグ バージョンのインポートは失敗します。リリース バージョンが .pyd ファイルを出力するように、プロジェクトのプロパティも変更します。

プロパティ >> リンカー >> 出力:

$(OutDir)\$(ProjectName).pyd

(Python から単体テストを実行するためのビルド後のアクションも作成します)

次に、stdafx.h ファイルで次のように定義してください。

#define BOOST_PYTHON_STATIC_LIB

最後に、複数の python バージョンがインストールされている場合は、適切なバージョンの python.h をインポートしていることを確認してください ([ツール] >> [オプション] >> [プロジェクトとソリューション] >> [VC++ ディレクトリ] >> [インクルード ファイル])。

于 2010-01-07T12:08:05.770 に答える
5

エラーImportError: Dll load failedは、通常、.pyd モジュールが、見つからない他の DLL (多くの場合msvc*.dll ) に依存していることを意味します。メモ帳で .pyd ファイルを開き、「.dll」を検索してみてください。次に、すべての DLL 依存関係がディレクトリまたは PATH に存在するかどうかを確認します。

または、不足している依存関係を見つけるDependency Walkerを使用します

于 2010-01-08T21:32:12.160 に答える
1

これは数年前に出された質問ですが (まだ解決策を見つけるのは簡単ではありません)、今日も同じ問題に遭遇し、何時間も検索した後、最終的に実行可能な解決策を見つけました。

  • 理由は、@AndiDog が気づいたのと同じくらい単純です。作成した.pydファイルは、他の.dllに依存しています。
  • 私の場合、フォルダ[C++ boost folder]/stage/lib/の下のboost_python-vc120-mt-1_58.dll です。
  • したがって、このファイルをコピーして.pydファイル フォルダーの下に貼り付けると、Python はビルドしたプロジェクトを適切にインポートできます。

  • おそらく、動的ライブラリに依存せずにプロジェクトを構築し、代わりに静的ライブラリを使用するという他の解決策があるかもしれません。一部のソースでは、VS プリプロセッサでBOOST_PYTHON_STATIC_LIBを定義するように言われています。その場合、プロジェクトは動的ライブラリに依存しません (私は新しい C++er です)

  • プリプロセッサを定義するには、ルートは次のとおりです: C/C++ -> プリプロセッサ -> プリプロセッサ定義 -> BOOST_PYTHON_STATIC_LIB の編集
于 2016-07-02T05:13:59.643 に答える
0

フラグがあることを確認してください-lpython26(python2.6 を使用している場合)。ファイル名はhello_ext.pyd大文字と小文字を区別する必要があります。

于 2010-01-07T07:47:03.707 に答える