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

在python中定义一个结构以使用C库(dll)中的函数,python,dll,data-structures,header,ctypes,Python,Dll,Data Structures,Header,Ctypes,首先,对不起我的英语 我在Python脚本中使用动态库(gnu gsl库)中的函数时遇到一些麻烦 事实上,我知道如何使用函数,但我需要定义一个结构白色C类型的数据来使用特定的函数 首先,这是一个在C++脚本中使用函数的例子,我将在Python脚本中使用: double fn1 (double x, void * params) { return cos(x) + 1.0; } int main (void) { gsl_min_fminimizer *s;

首先,对不起我的英语

我在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_函数的类型定义为:

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中定义typedef gsl_函数来使用名为函数gsl_min_fminimizer_set的dll

多谢各位。
我希望我是明确的

我想你在寻找
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教程(特别是结构和回调函数)

应该是这样的:

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)

你看了吗?可能是另一个错误,但结果是:WindowsError:exception:access violation读取0x00000000,但是很难知道我的错误在哪里,所以我尝试安装接口pygsl。这并不比我想象的容易……关于pygsl的安装,我还有一个问题要问: