PythoncTypes函数指针

PythoncTypes函数指针,python,function-pointers,ctypes,Python,Function Pointers,Ctypes,我创建了一个C库,其中包含许多可以使用ctypes从python调用的函数。我已经考虑了一些简单的参数,但我被如何将正确的参数传递给以下函数所困扰: foo(double *, double *, void(*f1)(double *, double *, double, struct sys *), void(*f2)(double *, double *, double, struct sys *), struct sys *, double *, double, doubl

我创建了一个C库,其中包含许多可以使用ctypes从python调用的函数。我已经考虑了一些简单的参数,但我被如何将正确的参数传递给以下函数所困扰:

foo(double *, double *, void(*f1)(double *, double *, double, struct sys *),
    void(*f2)(double *, double *, double, struct sys *), struct sys *, double *,
    double, double, int, int, gsl_rng *)
我的出发点是为函数设置
.argtypes
。我用
指针(100*c\u double)
等对双数组进行排序

然而,我被困在如何传递函数指针上。我有许多函数(f1和f2的形式),它们与
foo
位于同一个库中,我想将它们作为参数传递给
foo

我想我已经通过使用以下代码成功地传递了struct sys*指针ok:

class sys(Structure):
    _fields_ = [("alpha", c_double),
                ("sigma", c_double)]
然后使用
指针(sys)
作为
argtype
。最后,
gsl\u rng
是GNU科学图书馆的典型随机数生成器;我不知道从哪里开始


有人能解释一下复杂的ctypes吗?

ctypes中的函数指针类型似乎介于不存在和未记录之间,但您仍然可以使用它们。关键是根本不定义argtypes

从:

函数对象。。。默认情况下,接受任意数量的参数,接受任意ctypes数据实例作为参数

因此,只要不指定argtypes,我们就应该能够在那里阻塞指针,并希望达到最佳效果,而这种方法实际上是可行的。下面是一个简单的工作示例:

f、 c:

f、 py:

输出:

$ gcc -o f.so -shared -fPIC f.c
$ python f.py
4
当然,如果您确实希望在指定argtypes时使用ctypes为您执行的类型检查,那么这对您没有帮助。我不知道有什么办法可以吃到那个蛋糕

import ctypes
so = ctypes.CDLL('/path/to/f.so')
f = so.f
g = so.g
print(f(3, g))
$ gcc -o f.so -shared -fPIC f.c
$ python f.py
4