VS2017开发Python C++扩展库并调试(二)

参考文献

C++获取PyArrayObject的维度

1
2
3
4
5
6
7
8
9
PyArrayObject *arrays[2];
// 获取维度数量
int ndims = PyArray_NDIM(arrays[0]);
// 获取各维的具体数值
npy_intp *dims = PyArray_SHAPE(arrays[0]);
// 输出各维度的数值
for (int i = 0; i < ndims; i++) {
std::cout << i << ": " << dims[i] << std::endl;
}

错误集锦

  1. UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xe8 in position 2: invalid continuation byte

    • 错误内容

      1
      2
      3
      4
      Traceback (most recent call last):
      File "E:\Code-of-C++\Python_Ext\ZKY_falsecolor_module_test\ZKY_falsecolor_module_test\ZKY_falsecolor_module_test.py", line 3, in <module>
      print(ZKY_falsecolor.get_temperature("this is a path"))
      UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 2: invalid continuation byte
    • 成因

      在模块参数采集时,使用std::string进行采集,而函数只支持char *类型。

    • 解决方案

      将std::string转换成char *即可。

  2. numpy报错:fails to pass a sanity check due to a bug in the windows runtime.

    • 错误内容

      1
      fails to pass a sanity check due to a bug in the windows runtime.
    • 成因

      numpy版本问题,1.19.4版本的numpy会发生此问题,卸载重装以前版本即可解决

    • 解决方案

      1
      2
      pip uninstall numpy
      pip install numpy==1.19.3
  3. MS自带python与anaconda冲突

  4. numpy裁剪后,memory order会保持裁剪前的顺序,使用reshape不会改变内存排列顺序,使用resize会重新组合内存顺序,按照行优先的顺序存储。

    在C++调用numpy迭代器中,会保持原有的内存顺序。如果使用最初创建的numpy数组则不需要resize,如果使用裁剪后的numpy数组则需要重新resize一下。

    NumPy 数组重塑形状和调整大小

-------------本文结束感谢您的阅读-------------
分享