提取ndarray时boost python-nullptr 我有一个C++代码,用PosithPython包执行Python脚本。只要我从python中提取int、string或其他非数组变量,一切都很好。但是,我必须提取一个numpy::ndarray并将其转换为cpp向量。我尝试了以下方法:
提取ndarray时boost python-nullptr 我有一个C++代码,用PosithPython包执行Python脚本。只要我从python中提取int、string或其他非数组变量,一切都很好。但是,我必须提取一个numpy::ndarray并将其转换为cpp向量。我尝试了以下方法:,python,c++,boost,boost-python,numpy-ndarray,Python,C++,Boost,Boost Python,Numpy Ndarray,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__"); obj
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();
但是,它以错误结束:
读取访问冲突BOOST\u NUMPY\u ARRAY\u API为空ptr
我还试图直接声明numpy::ndarray,就像
numpy::ndarray result\u array=extract(result)代码>但错误完全相同。我已经通过直接从python打印检查了我的ndarray
是否为空,它是否为空。在python步骤中,一切似乎都是正确的。那么,是什么导致了冲突以及如何修复它呢?由于您在使用numpy
模块时没有首先初始化它,因此会发生此错误
请注意官方的开头:
初始化Python运行时和numpy模块。在分段错误中调用这些结果失败:
namespace np = boost::python::numpy;
int main(int argc, char **argv)
{
Py_Initialize();
np::initialize();
您的代码缺少对np::initialize()的调用代码>如果你的意思是设置标题,我做了。我知道这个教程,但是它对我的问题没有帮助。关于使用数组,它更一般,在我的例子中,我认为问题在于提取步骤。我可以从intinput\u size=ret.shape(0)开始注释所有内容代码>,但仍然失败,并出现相同的错误。请提供。确定。问题已编辑。您在使用numpy模块之前忘记初始化它。添加numpy::initialize()调用Py_Initialize()后的code>代码>。谢谢,现在它可以工作了。我的信念是错误的,那是错误的;还将对衍生品进行初始化。当我读教程的时候,我忘记了这个小细节。
namespace np = boost::python::numpy;
int main(int argc, char **argv)
{
Py_Initialize();
np::initialize();