Chức năng C myfunc
hoạt động trên một đoạn dữ liệu lớn hơn. Các kết quả được trả về trong khối đến một chức năng gọi lại:Các đối tượng Python dưới dạng userdata trong các chức năng gọi lại của ctypes
int myfunc(const char *data, int (*callback)(char *result, void *userdata), void *userdata);
Sử dụng ctypes, nó không có gì to tát để gọi myfunc
từ mã Python, và để có kết quả được trả lại cho một hàm Python gọi lại. Điều này làm việc gọi lại tốt.
myfunc = mylib.myfunc
myfunc.restype = c_int
myfuncFUNCTYPE = CFUNCTYPE(STRING, c_void_p)
myfunc.argtypes = [POINTER(c_char), callbackFUNCTYPE, c_void_p]
def mycb(result, userdata):
print result
return True
input="A large chunk of data."
myfunc(input, myfuncFUNCTYPE(mycb), 0)
Nhưng, có cách nào để cung cấp cho đối tượng Python (danh sách) làm userdata cho hàm gọi lại không? Để lưu trữ đi các khối kết quả, tôi muốn làm ví dụ:
def mycb(result, userdata):
userdata.append(result)
userdata=[]
Nhưng tôi không có ý tưởng làm thế nào để đúc danh sách Python để một c_void_p, vì vậy nó có thể được sử dụng trong các cuộc gọi đến MyFunc .
Giải pháp hiện tại của tôi là triển khai danh sách được liên kết dưới dạng cấu trúc ctypes, điều này khá cồng kềnh.
Vâng, điều tốt đẹp về ctypes là mọi thứ đều có thể được thực hiện bằng Python đơn giản. Vì vậy, Python C API có vẻ là một bước trở lại. Hay tôi đang thiếu một cái gì đó? – flight
Tôi có nghĩa là tùy chọn có thể tạo proxy ctypes của cấu trúc C-API PyObject, đó phải là biểu diễn bên trong của bất kỳ đối tượng Python nào và chuyển nó xung quanh ... – fortran
Lạ. Cách giải quyết của bạn với một đóng cửa hoạt động tốt trên Linux, nhưng cùng một chương trình bị treo trên Windows. – flight