Поиск…


Вводный пример на Boost.Python

Все просто, когда вам нужно использовать библиотеку C ++ в проекте Python. Просто вы можете использовать Boost.

Прежде всего, вот список компонентов, которые вам нужны:

  • Файл CMakeList.txt, потому что вы собираетесь использовать CMake.
  • C ++-файлы проекта C ++.
  • Файл python - это ваш проект python.

Начнем с небольшого файла C ++. Наш проект на C ++ имеет только один метод, который возвращает некоторую строку «Это первая попытка». Назовите его 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. Вызовите проект myProject.py python.

import NativeLib
print (NativeLib.getTryString)

Чтобы запустить проект, выполните следующие действия:

  • Создайте каталог с именем build .
  • Войдите в этот каталог.
  • cmake -DCMAKE_BUILD_TYPE=Release .. команду cmake -DCMAKE_BUILD_TYPE=Release ..
  • make
  • python MyProject.py . Теперь вы должны увидеть строку, возвращаемую методом в вашем проекте C ++.

Обтекание std :: vector в boost.python

Если функция возвращает тип std::vector , она подвергается прямому Python

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

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

тогда, когда вызываемые функции называются Python, вы скажете вам, No to_python (by-value) converter found for C++ type: std::vector<float, std::allocator<float> > , потому что Python должен знать, как бороться со std::vector .

К счастью, boost.python предоставил нам функцию wrapper в 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);
}

Результат может быть далее преобразован в список Python или массив Numpy просто путем вызова list() и numpy.asarray() .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow