web-dev-qa-db-ja.com

Pybind11を使用してC ++をPython

pythonで完全なコードを書き直さずに、pythonで使用しようとしている、c ++で記述されたコードがあり、Pybind11を使用してpythonそのためのモジュール。ここでこのチュートリアルに従うことにより、Microsoft Visual Studio 2015でこのことを達成しようとしています https://pybind11.readthedocs.io/en/stable/basics .html

VisualStudioで次のことをしました。 1)Pybind11を https://codeload.github.com/pybind/pybind11/Zip/master からダウンロードしました

2)ファイルを解凍しました

3)Visual Studioで、新しい空のC++プロジェクトを開始しました。

4)VC++ディレクトリにmy pythonインタプリタインクルードフォルダ(C:/ python27/include)とPybind11(C:/ Pybind11/include)を追加>インクルードディレクトリ

5)リンカー>入力>追加の依存関係に追加の依存関係(C:\ Python27\libs\python27.lib)を追加しました

6)Pythonで出力ファイルを使用するには、.pydファイルが必要なので、ここで変更します。構成プロパティ>一般>ターゲット拡張子:.pyd

7)プロジェクトのデフォルト>構成タイプをダイナミックライブラリ(.dll)に変更します

したがって、プロジェクトをビルドして.pydファイルを生成することはできますが、このモジュールをインポートすると、次のエラーが発生します:ImportError:動的モジュールがinit関数を定義していません(initProject11)

このエラーを検索して、このリンクを取得しました http://pybind11.readthedocs.io/en/stable/faq.html しかし、解決策が見つかりませんでした。

だから私は上記の問題の解決策を探しています。よろしくお願いします。

これが私のCPPファイルコードです

#include <pybind11/pybind11.h>

int add(int i, int j) {
return i + j;
}

namespace py = pybind11;

PYBIND11_PLUGIN(example) {
    py::module m("example", "pybind11 example plugin");

    m.def("add", &add, "A function which adds two numbers");

    return m.ptr();
}
12
flamelite

Pythonでは、_.pyd_ファイルの名前は内部にあるモジュールと同じである必要があります。ドキュメントから( https://docs.python.org/2/faq/windows.html ):

_foo.pyd_という名前のDLL)がある場合は、関数initfoo()が必要です。次にPython“ import foo」、およびPythonはfoo.pyd(およびfoo.py、foo.pyc)を検索し、見つかった場合はinitfoo()を呼び出そうとします。それを初期化します。

コードでは、exampleという名前のpythonモジュールを作成するため、出力ファイルは_example.pyd_である必要があります。

編集:

Pybind11 FAQは、互換性のないpythonバージョンを別の考えられるエラーソースとして言及しています( https://pybind11.readthedocs.io/en/stable/ faq.html ):

ImportError:動的モジュールが初期化関数を定義していません

  1. _pybind::module_および_PYBIND11_PLUGIN_で指定された名前が一貫性があり、拡張ライブラリのファイル名と同一であることを確認してください。後者には追加のプレフィックスを含めないでください(例:libtest.soの代わりにtest.so)。

  2. 上記で問題が解決しなかった場合は、互換性のないバージョンのPythonを使用している可能性があります(たとえば、拡張ライブラリはPython 2、インタプリタがPython 3、またはその逆)のバージョンの上で実行されている間

7
pschill