попытался получить массив из функции C в Python3 - PullRequest
0 голосов
/ 08 июля 2019

Я пытался использовать ctypes для получения массива из функции C в Python3, не удалось.

Система macOS Mojave 10.14.5. Версия Python3 - 3.7.3.

Вот код C:

#include "stdlib.h"

#include "stdio.h"

int* func(int num){

    int *result = (int *)malloc(num*sizeof(int)), i=num ;
    while (i-->0){
        result[i] = num-i;
        printf("%d:%d\n",i, num-i);
    }
    return result;
}

А вот код Python3: из импорта ctypes *

dll = CDLL('./test.so')
func = dll.func
func.argtypes = [c_int]
func.restypes = POINTER(c_int*12)
res = func(12)#Here res is an int
res = cast(res, POINTER(c_int*12)).contents
for i in res:
    print(i)#Segmentation fault: 11

I, кроме результата, можно преобразовать в numpy.ndarray.

1 Ответ

1 голос
/ 08 июля 2019

У вас есть опечатка в атрибуте func.restypes. Он должен называться func.restype (см. Документ здесь ). Изменение атрибута удаляет segfault для меня и правильно печатает массив.

Это также делает приведение лишним, и вы можете напрямую перебирать содержимое следующим образом:

func = dll.func
func.argtypes = [c_int]
func.restype = POINTER(c_int*12)
res = func(12)
for i in res.contents:
    print(i)
...