我有一个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
我在做什么错了?
答案 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