Python ctypes函数poin

2024-05-15 06:05:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个C-library,其中包含许多可以使用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。我用POINTER(100*c_double)等对双数组进行排序

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

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

^{pr2}$

然后使用POINTER(sys)作为argtype。最后,gsl_rng是来自GNU科学图书馆的一个典型的随机数生成器;我不知道从哪里开始。在

有谁能对复杂的ctypes有所了解吗?在


Tags: 函数foosyslibraryctypesstructintf2
1条回答
网友
1楼 · 发布于 2024-05-15 06:05:36

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

ctypes documentation

The function objects ... by default accept any number of arguments, accept any ctypes data instances as arguments, ...

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

f.c.:

int f(int n, int (*h)(int)){ return (*h)(n); }
int g(int n){ return n+1; }

f.py公司:

^{pr2}$

输出:

$ gcc -o f.so -shared -fPIC f.c
$ python f.py
4

当然,如果您真的希望在指定argtypes时进行类型检查,那么这对您没有帮助。我不知道有什么方法能吃到那个蛋糕。在

相关问题 更多 >

    热门问题