2011-02-11 21 views
0

對於開始,對不起我的英語。在python中定義一個使用C庫函數的結構(dll)

我在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中定義typedef gsl_function以使用名爲function gsl_min_fminimizer_set的dll?

謝謝。 我期待我明確

+0

你看看[PyGSL(http://pygsl.sourceforge.net/)? – 2011-02-11 16:29:50

+0

我不知道這個,我會嘗試 – Johnraikonen 2011-02-11 16:51:49

回答

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 documentation.

2

你應該看看this 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) 
相關問題