2010-04-28 20 views
6

Tôi cần chuyển một hàm gọi lại là CFuncType (ctypes.CFUNCTYPE hoặc ctypes.PYFUNCTYPE ...).Cách tạo một CFuncType bằng Python

Làm cách nào tôi có thể truyền hàm python vào CFuncType hoặc cách tôi có thể tạo hàm CFuncType trong python.

Trả lời

8

Tôi quên thế nào ctypes tuyệt vời là:

Dưới đây là sao chép từ http://docs.python.org/library/ctypes.html

Vì vậy, hàm callback của chúng tôi nhận được con trỏ đến số nguyên, và phải trả lại một số nguyên. Đầu tiên chúng ta tạo kiểu cho hàm callback:

CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int)) 

Đối với việc thực hiện đầu tiên của hàm callback, chúng tôi chỉ đơn giản là in các đối số chúng tôi nhận được, và trở về 0 (phát triển gia tăng ;-):

def py_cmp_func(a, b): 
    print "py_cmp_func", a, b 
    return 0 

Tạo cuộc gọi lại có thể gọi lại bằng C:

cmp_func = CMPFUNC(py_cmp_func) 
+0

Oh, yeah! Điều đó chỉ là lừa. cảm ơn. Tôi chuyển cpm_func đó đến một ctypes.Structure có trường 'gọi lại', ctypes.CFUNCTYPE (c_int, POINTER (c_int), POINTER (c_int)) – manson54

+0

Bạn sẽ làm gì nếu kiểu trả về của cuộc gọi lại là ' void'? Không có 'c_void' để chỉ định làm đối số đầu tiên của' CFUNCTYPE'. – Shahbaz

+0

Từ [this] (https://gitorious.org/telldus/telldus/commit/1108f3fad26f744c2418d22a547a17669522ce2e) có vẻ như 'None' nên được sử dụng. – Shahbaz

Các vấn đề liên quan