Определите структуру в Python для использования функции из библиотеки C (dll) - PullRequest
0 голосов
/ 11 февраля 2011

Для начала, извините за мой английский.

У меня возникли проблемы с использованием функции из динамической библиотеки (библиотеки gnu gsl) в скрипте Python.

Действительно, я знаю, что использую функцию, но мне нужно определить белые данные типа 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);

       ...
}

typedef для 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.

Есть кто-то, кто знает, как я могу определить typedef gsl_function в Python для использования dll, называемой функцией gsl_min_fminimizer_set?

Спасибо. Я ожидаю, что я явно

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Вы должны взглянуть на это руководство по ctypes (особенно функции Structures и Callback).

Это должно быть примерно так:

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)
0 голосов
/ 11 февраля 2011

Я думаю, что вы ищете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...