ctypesでC言語側の配列データを取得する方法
// c_hoge.cpp #include "c_hoge.h" #include <stdlib.h> static int numData = 0; static float* arData = NULL; void getArrayData(float** ppMem, int* pSize) { if (!arData) { numData = 10000; arData = new float[numData]; for (int i=0; i<numData; i++) { arData[i] = i; } } *pSize = numData; *ppMem = arData; }
// c_hoge.h #pragma once #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) void getArrayData(float** ppMem, int* pSize); #ifdef __cplusplus } #endif
g++でDLLを作成。
> g++ -static -shared -o c_hoge.dll c_hoge.cpp
# test.py from ctypes import * import sys cdll = cdll.LoadLibrary('c_hoge.dll') getArrayData = cdll.getArrayData getArrayData.argtypes = [POINTER(POINTER(c_float)), POINTER(c_int)] getArrayData.restype = None mem = POINTER(c_float)() size = c_int(0) getArrayData(byref(mem), byref(size)) print size.value, mem[0], mem[1], mem[2:4], mem[size.value-1]
実行結果。
>python test.py 10000 0.0 1.0 [2.0, 3.0] 9999.0