如何在python3 ctypes中返回ndarray

时间:2018-08-02 14:11:20

标签: python multidimensional-array ctypes

我有一个c ++函数

double* hiho() {
  double *res = new double[10];
  return res;
}

一起
from numpy.ctypeslib import ndpointer

mylib.hiho.restype = ndpointer(dtype=ctypes.c_double, shape=(10,))

调用该函数时,出现以下错误:

ValueError: '<P' is not a valid PEP 3118 buffer format string

我使用Python 3.6.2

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

我无法重现您的错误,但是可以。如果无法解决问题,请提供一个可复制的示例:

test.cpp (Windows)

#define API __declspec(dllexport) // Windows-specific export

extern "C" API double* hiho() {
  double *res = new double[10];
  for(int i = 0; i < 10; ++i)
      res[i] = .1 * i;
  return res;
}

test .py

import ctypes
from numpy.ctypeslib import ndpointer

mylib = ctypes.CDLL('test')
mylib.hiho.restype = ndpointer(dtype=ctypes.c_double, shape=(10,))
print(mylib.hiho())

输出

[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]

答案 1 :(得分:0)

我已将numpy更新为1.18.1版。 现在,这很好用:

from numpy.ctypeslib import ndpointer

mylib.hiho.restype = ndpointer(dtype=ctypes.c_double, shape=(10,))

要简单地更新numpy:

pip install numpy --upgrade

有关您的信息:

使用numpy 1.15.4时,您的示例Mark带有* double或* int时出现了相同的错误。

我在MacOS上的编译行:

g++ -c -fPIC -std=c++17 test.cpp -o test.o

g++ -dynamiclib -undefined suppress -flat_namespace test.o -o test.dylib

g++ -c test.cpp -o test.o

g++ -dynamiclib -undefined suppress -flat_namespace test.o -o test.dylib

错误:

ValueError: '<P' is not a valid PEP 3118 buffer format string