scipy.io.loadmat() 导致指向 PyImport_Import() 的空指针

scipy.io.loadmat() is causing a null pointer to PyImport_Import()

本文关键字:PyImport Import 空指针 io loadmat scipy      更新时间:2023-10-16

我正在使用 scipy.io 通过python加载.mat文件。然后,我想在Visual Studio中使用c ++导入此python脚本。

例 1:testpython.py

    b=[0,1,2,3]

测试导入.cpp

    PyObject *pName = PyUnicode_FromString((char*)"testpython");
    std::cout << pName << std::endl; 
    // Load the module object
    PyObject *pModule = PyImport_Import(pName);
    std::cout << pModule << std::endl;
    PyObject *b = PyObject_GetAttrString(pModule, "b");
    std::cout << b << std::endl;
    PyObject *barray = PyArray_FromObject(b, NPY_DOUBLE, 1, 2);
    std::cout << barray << std::endl;

这有效,但这不是我想做的。

例2:

testpython.py

     import scipy.io as sio
     x=sio.loadmat('matfile.m')
     y=x['variable1']

测试导入.cpp

     PyObject *pName = PyUnicode_FromString((char*)"testpython");
     std::cout << pName << std::endl; 
     // Load the module object
     PyObject *pModule = PyImport_Import(pName);
     std::cout << pModule << std::endl;
     PyObject *b = PyObject_GetAttrString(pModule, "y");
     std::cout << b << std::endl;
     PyObject *barray = PyArray_FromObject(b, NPY_DOUBLE, 1, 2);
     std::cout << barray << std::endl;
pModule 返回 null 并且当在 python 中使用 sio.loadmat 时代码

会中断,但在不使用 sio.loadmat 时它会起作用。有没有人对正在发生的事情以及如何解决这个问题有任何建议?

谢谢!

在评论中,你说y是3D(形状120x120x60(。您已在PyArray_FromObject调用中设置 2D 上限:

//                                                      v right here
PyObject *barray = PyArray_FromObject(b, NPY_DOUBLE, 1, 2);