2012-12-13 111 views
2

這裏是場景:我正在使用ctypes將C DLL加載到Python程序中。我想註冊一個回調函數,以便DLL中的代碼可以在Python中調用一個函數。我可以使用ctypes創建可變參數Python函數的原型,以便DLL可以將此函數作爲回調函數調用嗎?

這是非常棒的,直到我想讓函數變得可變。例如,假設我想要實現的「printf」在Python(爲了便於討論,我也會把它返回一個整數):

def printf(format, *args): 
    (...) 
    return 0 

我在ctypes的使用CFUNCTYPE工廠創建回調函數指針:

callback_type = CFUNCTYPE(c_int, c_wchar_p) 

當然,因爲我只能指定一個輸入參數(格式字符串作爲Unicode字符數組),回調作品但*args是空的。

那麼,有沒有什麼辦法讓這個工作與ctypes,或者我需要重寫我的C代碼,不需要可變的回調函數?

回答

2

不,它不受底層libffi的支持。你確實需要編寫自定義的C代碼。

(FWIW,CFFI是一個ctypes替代。同樣基於libffi,其從相同的限制遭受---但是至少它可以很容易地寫出的C代碼定製件做接口。)

+0

好的,感謝CFFI的小貼士! –

+0

編輯CFFI的文檔,以C語言編寫的自定義回調爲例,本身回調到Python。 –

相關問題