2014-10-07 58 views
2

使用ctypes的,我想使用ctypes的在Python調用C函數用typedef

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

。數據類型定義爲

typedef uint32_t My_Session; 
typedef int32_t My_Status; 

現在我想知道如何使用ctypes傳遞參數。我是否使用c_uint32c_int32,還是必須定義一個類,如同爲結構完成的那樣?

回答

1

來自eryksun的評論讓我走上了正軌。

在Python文件,我不得不定義:

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整數。然後返回sessionstatus作爲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函數是否也能識別unix系統上的libTest.so? – erik 2014-10-08 11:04:44

+0

這是我在這裏使用的私人圖書館。我只是想知道當我在Linux中做類似的事情時是否可以使用相同的功能。如果我知道了,我需要在這種情況下調用'CDLL('libtest.so')'。 – erik 2014-10-09 11:35:36