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

2024-09-28 19:32:09 发布

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

首先,对不起我的英语。在

在Python脚本中使用动态库(gnugsllibrary)中的函数有一些问题。在

实际上,我知道使用函数,但是我需要定义一个结构whitec类型的数据来使用一个特殊的函数。在

首先,这是一个在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_函数的typedef为:

^{pr2}$

我知道在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_fminizer_set时,我需要在名为gsl_function的头中定义一个特殊类型。在

有人知道如何在Python中定义typedef gsl_函数,以使用名为函数gsl_min_fminizer_set的dll?在

谢谢。 我希望我是明确的


Tags: 函数脚本类型定义libfunctionmindouble
2条回答

我想你在找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 documentation.

您应该看看thisctypes教程(特别是结构和回调函数)。在

应该是这样的:

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)

相关问题 更多 >