Python — Ошибка типа Pybind11

Недавно я пытался написать функцию на C ++, которая преобразует вектор значений типа double в вектор строк. Я хочу запустить это из интерпретатора Python, поэтому я использую Pybind11 для взаимодействия C ++ и Python. Это то, что я имею до сих пор,

#include <pybind11/pybind11.h>
#include <boost/lexical_cast.hpp>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <vector>std::string castToString(double v) {
std::string str = boost::lexical_cast<std::string>(v);
return str;
}

std::vector<std::vector<std::string> > num2StringVector(std::vector<std::vector<double> >& inputVector) {//using namespace boost::multiprecision;std::vector<std::vector<std::string> > outputVector;

std::transform(inputVector.begin(), inputVector.end(), std::back_inserter(outputVector), [](const std::vector<double> &iv) {
std::vector<std::string> dv;
std::transform(iv.begin(), iv.end(), std::back_inserter(dv), &castToString);
return dv;
});

return outputVector;
}namespace py = pybind11;

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

m.def("num2StringVector", &num2StringVector, "this converts a vector of doubles to a vector of strings.");
m.def("castToString", &castToString, "This function casts a double to a string using Boost.");

return m.ptr();
}

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

c++ -O3 -shared -std=gnu++11 -I ../include `python-config --cflags --ldflags --libs` num2StringVectorPyBind.cpp -o num2String.so -fPIC -lquadmath

где ../include — это то, где находится pybind11. После компиляции запустите Python и используйте

import num2String
values = [[10, 20], [30, 40]]
num2String.num2StringVector(values)

И я получаю следующую ошибку: «Несовместимые аргументы функции. Поддерживаются следующие типы аргументов». Когда он дает мне список возможных типов, это странно, потому что я просто пытаюсь использовать вектор в качестве аргумента своей функции, который согласно документации для pybind11 это поддерживаемый тип данных:
http://pybind11.readthedocs.io/en/latest/basics.html#supported-data-types

Это то, что у меня есть вектор векторов (2d вектор), и это не поддерживается?

4

Решение

Вы можете сделать это с помощью только одной дополнительной строки кода:

#include <pybind11/stl.h>

Согласно документация:

Следующие основные типы данных поддерживаются сразу после установки (для некоторых может потребоваться дополнительный заголовок расширения).

Перед включением pybind11/stl.h:

>>> import num2String
>>> num2String.num2StringVector([[1, 2], [3, 4, 5]])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Incompatible function arguments. The following argument types are supported:
1. (std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >) -> std::vector<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::allocator<std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >

После включения pybind11/stl.h и перекомпилируем разделяемую библиотеку:

>>> import num2String
>>> num2String.num2StringVector([[1, 2], [3, 4, 5]])
[['1', '2'], ['3', '4', '5']]
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]