在Python中定义结构以使用C库中的函数(dll)

0 投票
2 回答
1059 浏览
提问于 2025-04-16 11:39

首先,抱歉我的英语不好。

我在用Python脚本调用一个动态库(gnu gsl库)里的函数时遇到了一些问题。

其实,我知道怎么使用一个函数,但我需要定义一个C语言类型的数据结构,才能使用一个特定的函数。

首先,这是一个在C++脚本中使用该函数的例子,我想在Python脚本中使用:

    double fn1 (double x, void * params)
{
    return cos(x) + 1.0;
}
int
main (void)
{
       gsl_min_fminimizer *s;
       double m = 2.0, m_expected = M_PI;
       double a = 0.0, b = 6.0;
       gsl_function F;

       F.function = &fn1;
       F.params = 0;

       T = gsl_min_fminimizer_brent;
       s = gsl_min_fminimizer_alloc (T);
       gsl_min_fminimizer_set (s, &F, m, a, b);

       ...
}

在头文件中,gsl_function的类型定义是:

struct gsl_function_struct 
{
  double (* function) (double x, void * params);
  void * params;
};

typedef struct gsl_function_struct gsl_function ;

#define GSL_FN_EVAL(F,x) (*((F)->function))(x,(F)->params)

我知道怎么用ctypes来调用一个函数:

#Library Call

lib_gsl=CDLL(path_gsl+"gsl.dll")

#Functions Define

gsl_opti_brent=lib_gsl.gsl_min_fminimizer_brent
gsl_opti_alloc=lib_gsl.gsl_min_fminimizer_alloc
gsl_opti_init=lib_gsl.gsl_min_fminimizer_set

T=gsl_opti_brent
T_=pointer(T)
s=gsl_opti_alloc(T_)

到这里为止没有问题,但当我想使用gsl_min_fminimizer_set这个函数时,我需要在一个叫做gsl_function的头文件中定义的特定类型。

有没有人知道我该如何在Python中定义这个gsl_function的类型,以便使用dll中的gsl_min_fminimizer_set函数?

谢谢。希望我说得够清楚。

2 个回答

0

我觉得你在找的是 ctypes.Structure。这里有一种在Python中创建结构体的方法;

>>> from ctypes import *
>>> class POINT(Structure):
...     _fields_ = [("x", c_int),
...                 ("y", c_int)]
...
>>> point = POINT(10, 20)
>>> print point.x, point.y
10 20

想要更多例子,可以查看 ctypes的文档。

2

你可以看看这个 ctypes 教程(特别是关于结构体和回调函数的部分)。

它应该是这样的:

MY_FUNC_TYPE = CFUNCTYPE(c_double, c_double, c_void_p)
class GSL_FUNCTION(Structure):
    _fields_ = [("function", MY_FUNC_TYPE),
                ("params", c_void_p)]

def py_fn1(x, params):
    return cos(x) + 1.0

fn1 = MY_FUNC_TYPE(py_fn1)

F = GSL_FUNCTION(fn1, 0)

撰写回答