Boost Python - nullptr при извлечении ndarray - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть код 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 все кажется правильным.Так в чем же причина нарушения и как его исправить?

1 Ответ

0 голосов
/ 27 февраля 2019

Эта ошибка возникает, поскольку вы используете модуль numpy без предварительной инициализации.

Обратите внимание на начало официального учебника :

Инициализируйте среду выполнения Python и модуль numpy.Невозможность вызвать эти результаты из-за ошибок сегментации:

namespace np = boost::python::numpy;
int main(int argc, char **argv)
{
  Py_Initialize();
  np::initialize();

В вашем коде отсутствует вызов np::initialize();.

...