我需要将指针从Python传递给C函数。我目前正在尝试使用 SWIG,但我已准备好切换到任何可以解决我的问题:)
为了简化我的问题,我在 SWIG 中编写了这个空的 C 函数:
extern void myvoidp(void *p);
我已经设置了我的.i和.c文件,都可以很好地编译并在Python中工作。
我想传递一个 Numpy 数组。我可以像这样获取 Numpy 数据的内存地址
>>> anp = array([1,2,3])
array([1, 2, 3])
>>> anp.ctypes.data
40546992
我可以像这样用 ctypes 和 numpy 将其投射到空白 *:
>>> anp.ctypes.data_as(ctypes.c_void_p)
c_void_p(40546992)
我尝试了无穷无尽的变体。无论我做什么,当我调用我的 C 函数时,我都会收到此错误。
>>> myswig.myvoidp(anp.ctypes.data_as(ctypes.c_void_p))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: in method 'myvoidp', argument 1 of type 'void *'
我不知道如何编写一个Python/numpy语句,允许我(简单地(传递指向我的C函数的指针。
我想你想接收一个指向 NumPy 数组数据的指针,以便你可以从 C 访问数组元素。 NumPy附带SWIG支持,使用起来既简单又方便。 只需下载numpy.i
并将其放在项目目录中即可。
只需将 C 函数的签名从(void *p)
更改为(double *data, int length)
并应用 NumPy 类型映射。
test.i
%module example
%{
#define SWIG_FILE_WITH_INIT
#include <stdio.h>
void myvoidp(double *data, int length) {
printf("data = [ ");
for (int i = 0; i < length; ++i) {
printf("%f ", data[i]);
}
printf("]n");
}
%}
%include "numpy.i"
%init %{
import_array();
%}
%apply (double* IN_ARRAY1, int DIM1) {(double *data, int length)}
void myvoidp(double *data, int length);
test.py
from example import myvoidp
from numpy import array
anp = array([1,2,3])
myvoidp(anp)
调用示例:
$ swig -python test.i
$ clang -Wall -Wextra -Wpedantic -I /usr/include/python3.6m/ -fPIC -shared -o _example.so test_wrap.c -lpython3.6m
$ python3 test.py
data = [ 1.000000 2.000000 3.000000 ]