gpt4 book ai didi

Python ctypes 函数指针

转载 作者:行者123 更新时间:2023-11-28 18:42:05 29 4
gpt4 key购买 nike

我创建了一个包含许多函数的 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。我得到了用 POINTER(100*c_double) 等排序的 double 组。

但是,我对如何传递函数指针感到困惑。我有许多函数(形式为 f1 和 f2),它们位于与 foo 相同的库中,我想将其作为参数传递给 foo

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

class sys(Structure):
_fields_ = [("alpha", c_double),
("sigma", c_double)]

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

任何人都可以阐明复杂的 ctypes 吗?

最佳答案

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

来自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:

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

当然,如果您真的想要 ctypes 在指定 argtypes 时为您执行的类型检查,那么这对您没有帮助。我不知道有什么办法可以吃到那 block 特别的蛋糕。

关于Python ctypes 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25014191/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com