在提取ndarray时提升python-nullptr

时间:2019-02-27 11:28:25

标签: python c++ boost boost-python numpy-ndarray

我有一个C ++代码,可以使用boost_python包执行python脚本。只要我从python中提取int,字符串或其他非数组变量,一切都很好。但是,我必须提取一个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 为nullptr

我也试图像numpy::ndarray result_array = extract<numpy::ndarray>(result);一样直接声明numpy :: ndarray,但是错误是完全一样的。我通过直接从python打印它来检查我的ndarray是否不为空,事实并非如此。在python步骤,一切似乎都是正确的。那么,是什么原因导致违规以及如何解决呢?

1 个答案:

答案 0 :(得分:2)

由于您使用的是numpy模块而没有对其进行初始化,因此会发生该错误。

请注意官方tutorial的开头:

  

初始化Python运行时和numpy模块。调用失败会导致细分错误:

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

您的代码缺少对np::initialize();的调用。