サーチ…


Boost.Pythonの入門例

PythonプロジェクトでC ++ライブラリを使用する必要がある場合は簡単です。 Boostを使うことができます。

まず最初に、必要なコンポーネントの一覧を示します。

  • CMakeを使用するので、CMakeList.txtファイル。
  • C ++プロジェクトのC ++ファイル。
  • pythonファイル - これはあなたのpythonプロジェクトです。

小さなC ++ファイルから始めましょう。私たちのC ++プロジェクトには、 "これが最初の試みです"という文字列を返すメソッドが1つしかありません。それをCppProject.cpp呼ぶ

char const *firstMethod() {
    return "This is the first try.";
}

BOOST_PYTHON_MODULE(CppProject) {
    boost::python::def("getTryString", firstMethod); // boost::python is the namespace
}

以下のCMakeLists.txtファイルを用意してください:

cmake_minimum_required(VERSION 2.8.3)
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
FIND_PACKAGE(Boost COMPONENTS python)

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})

PYTHON_ADD_MODULE(NativeLib CppProject)
FILE(COPY MyProject.py DESTINATION .) # See the whole tutorial to understand this line

チュートリアルのこの部分では、すべてがとても簡単です。 Pythonプロジェクトでライブラリと呼び出しメソッドをインポートすることができます。 PythonプロジェクトMyProject.pyを呼び出します。

import NativeLib
print (NativeLib.getTryString)

プロジェクトを実行するには、以下の手順に従ってください:

  • buildという名前のディレクトリを作成します。
  • そのディレクトリに入力します。
  • cmake -DCMAKE_BUILD_TYPE=Release ..コマンドをcmake -DCMAKE_BUILD_TYPE=Release ..
  • make
  • python MyProject.py 。これで、C ++プロジェクトのメソッドが返す文字列を確認する必要があります。

boost.pythonのstd :: vectorのラッピング

関数がstd::vector型を返し、それが直接Pythonに公開されている場合

std::vector<float> secondMethod() {
    return std::vector<float>();
}

BOOST_PYTHON_MODULE(CppProject) {
    boost::python::def("getEmptyVec", secondMethod);
}

関数が呼び出されるとPythonは、Pythonがstd::vectorを処理する方法を知っておく必要があるためNo to_python (by-value) converter found for C++ type: std::vector<float, std::allocator<float> > std::vector

幸いboost.pythonは、米国のラッパーfuncitonを提供してきましたvector_indexing_suite.hpp 。戻り値は、対応するラッパー関数を次のように公開することによって、要素が[]演算子によってアクセスできるFloatVecオブジェクトとして扱うことができます。

std::vector<float> secondMethod() {
    return std::vector<float>();
}

BOOST_PYTHON_MODULE(CppProject) {
    // wrapper function
    class_<std::vector<float> >("FloatVec")
        .def(vector_indexing_suite<std::vector<float> >());
    boost::python::def("getEmptyVec", secondMethod);
}

結果は、 list()numpy.asarray()呼び出すだけで、さらにPythonリストまたはNumpy配列に変換できます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow