У меня есть код C ++, который выполняет скрипт Python с пакетом boost_python.Все хорошо, пока я извлекаю переменные типа int, string или другие не-массивы из python.Однако я должен извлечь numpy::ndarray
и преобразовать его в cpp vector
.Я попытался следующим образом:
main.cpp
#include <iostream>
#include <boost/python.hpp>
#include <boost/python/numpy.hpp>
using namespace boost::python;
int main()
double t_end=7
try
{
Py_Initialize();
object module = import("__main__");
object name_space = module.attr("__dict__");
exec_file("MyModule.py", name_space, name_space);
object MyFunc = name_space["MyFunc"];
object result = MyFunc(t_end);
auto result_array = extract<numpy::ndarray>(result);
const numpy::ndarray& ret = result_array();
int input_size = ret.shape(0);
double* input_ptr = reinterpret_cast<double*>(ret.get_data());
std::vector<double> v(input_size);
for (int i = 0; i < input_size; ++i)
v[i] = *(input_ptr + i);
}
catch (error_already_set)
{
PyErr_Print();
}
Py_Finalize();
И пример сценария py:
MyModule.py
import numpy as np
def MyFunc(t_end):
result = np.array([2,3,1,t_end])
return results
Однако это заканчиваетсяошибка:
нарушение прав чтения BOOST_NUMPY_ARRAY_API was nullptr
Я также пытался объявить numpy :: ndarray напрямую, как numpy::ndarray result_array = extract<numpy::ndarray>(result);
Но ошибкаточно так же.Я проверил, не является ли мой ndarray
пустым, напечатав его непосредственно из python, и это не так.На этапе Python все кажется правильным.Так в чем же причина нарушения и как его исправить?