【问题标题】:scipy.io.loadmat() is causing a null pointer to PyImport_Import()scipy.io.loadmat() 导致指向 PyImport_Import() 的空指针
【发布时间】:2018-04-12 19:41:42
【问题描述】:

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

例如。 1: testpython.py

    b=[0,1,2,3]

testimport.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']

testimport.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 在 python 中使用 sio.loadmat 时返回 null 并且代码中断,但在不使用 sio.loadmat 时它可以工作。有没有人对正在发生的事情以及如何解决这个问题有任何建议?

谢谢!

【问题讨论】:

  • testpython.py 用作 Python 脚本时是否运行?结果y 是什么? (形状,dtype)。根据 MA​​TLAB 源,loadmat 字典可能非常复杂。
  • 形状为(120,120,60),dtype为float64。
  • 是的,testpython.py 在 python 中运行。

标签: python c++ visual-studio-2015 scipy


【解决方案1】:

在 cmets 中,您说 y 是 3D(形状 120x120x60)。您在 PyArray_FromObject 调用中设置了 2D 的上限:

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

【讨论】:

  • 谢谢!不幸的是,代码在到达那一行之前就中断了。 pModule 返回为 null。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 2020-09-07
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多