2014-10-07 4 views
2

Я хотел бы назвать функцию сИспользуйте ctypes с ЬурейиМи

void initialize(My_Session* session, My_Status* status); 

из Python, используя ctypes. Типы данных определяются

typedef uint32_t My_Session; 
typedef int32_t My_Status; 

Теперь я хотел бы знать, как я могу передать аргументы, используя ctypes. Использую ли я c_uint32 и c_int32, или мне нужно определить класс, как это делается для структур?

ответ

1

Комментарий от eryksun получил меня на ходу.

В файле питона я должен был определить:

from ctypes import * 

_libtest = CDLL('libTest') 

_libtest.initialize.argtypes = [POINTER(c_uint32), POINTER(c_int32)] 
_libtest.initialize.restype = None 

def initialize(session,status): 
    return _libtest.initialize(byref(session),byref(status)) 

if __name__ == '__main__': 
    session = c_uint32(); 
    status = c_int32(); 

    initialize(session, status) 

    print status 

Название библиотеки C должен быть libTest.dll.


В качестве альтернативы, определить initialize для создания ctypes целых чисел. Затем вернитесь session и status как целые Python:

def initialize(): 
    session = c_uint32() 
    status = c_int32() 
    _libtest.initialize(byref(session), byref(status)) 
    return session.value, status.value 

if __name__ == '__main__': 
    session, status = initialize() 
    print 'session:', session 
    print 'status:', status 
+0

Благодаря eryksun! Я изменил материал в соответствии с вашими предложениями. Я следовал примеру в http://nbviewer.ipython.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-6A-Fortran-and-C.ipynb Вот почему я пришел использовать numpy. ctypeslib. Будет ли функция CDLL распознавать libTest.so в системах unix? – erik

+0

Это частная библиотека, которую я здесь использую. Я просто хотел знать, могу ли я использовать одну и ту же функцию, когда я делаю подобные вещи в Linux. Если я правильно понял, мне нужно вызвать 'CDLL ('libtest.so')' в этом случае. – erik

Смежные вопросы