如何使用 ctypes 将矩阵从 C++ 函数返回到 Python

How to return a matrix from a C++ function to Python using ctypes

本文关键字:函数 C++ 返回 Python 何使用 ctypes      更新时间:2023-10-16

我想将矩阵从C++函数返回到Python函数。我已经检查了这个解决方案,这是一个返回数组的示例。

例如,我想返回一个填充1010x10数组。

功能.cpp:

extern "C" int* function(){
int** information = new int*[10];
for(int k=0;k<10;k++) {
    information[k] = new int[10];
    }
for(int k=0;k<10;k++) {
    for(int l=0;l<10;l++) {
        information[k][l] = 10;
        }
}
return *information;
}

Python 代码是:wrapper.py

import ctypes
from numpy.ctypeslib import ndpointer
lib = ctypes.CDLL('./library.so')
lib.function.restype = ndpointer(dtype=ctypes.c_int, shape=(10,))
res = lib.function()
print res

为了编译它,我使用:

g++ -c -fPIC function.cpp -o function.o
g++ -shared -Wl,-soname,library.so -o library.so function.o

如果soname不起作用,请使用install_name

g++ -c -fPIC function.cpp -o function.o
g++ -shared -Wl,-install_name,library.so -o library.so function.o

运行 python 程序后,python wrapper.py这是 im 的输出:
[10 10 10 10 10 10 10 10 10 10]

只有一行 10 个元素。我想要 10x10 矩阵。我做错了什么?提前谢谢。

function.cpp

extern "C" int* function(){
    int* result = new int[100];
    for(int k=0;k<100;k++) {
        result[k] = 10;
    }
    return result;
}

wrapper.py

lib.function.restype = ndpointer(dtype=ctypes.c_int, shape=(10,)) //incorrect shape
lib.function.restype = ndpointer(dtype=ctypes.c_int, ndim=2, shape=(10,10)) // Should be two-dimensional