Tôi đang cố gắng viết trình bao bọc xung quanh chương trình C để tôi có thể gọi nó từ Python. Tôi đang sử dụng Cython để làm điều này. Hàm C nhận hàm gọi lại làm đối số, nhưng hàm gọi lại này sẽ chỉ được biết khi chạy chương trình python. Tôi đã tìm kiếm cách thực hiện điều này và dường như không có giải pháp đơn giản nhưng có vẻ như sau đây hoạt động:Cách chuyển con trỏ hàm tới chương trình bên ngoài trong Cython
#python.py
libc = cdll.LoadLibrary("myfunc.so") #Callback function is defined in myfunc.so
....
c_wrapper(libc.fun, ...)
.
#c_wrapper.pyx
cdef extern void mainfunction(void *F, ...) #The intial C function we are wrapping
ctypedef void (*myfuncptr)()
def c_wrapper(f, ...) # our function pointer is passed to the wrapper as a Python object
cdef myfuncptr thisfunc
thisfunc = (<myfuncptr*><size_t>addressof(f))[0]
mainfunction(thisfunc, ...)
Phương pháp này làm việc cho các chức năng C và FORTRAN (tôi đang giả định nó sẽ làm việc cho languges biên soạn nhất) và chức năng Python (sử dụng các loại C), nhưng có vẻ như một chút vụng về. Có cách nào đơn giản hơn để làm điều này trong Cython?
Cảm ơn
EDIT: Tôi không thể thay đổi thư viện C Tôi cố gắng để quấn
Nó w sẽ tốt đẹp nếu có. Nhưng nếu bạn không nhận được bất kỳ, giải pháp đề xuất của bạn có thể hữu ích cho người khác. Trong trường hợp đó, có lẽ bạn có thể thuật lại nó thành một câu hỏi/giải pháp ghép đôi? – dsign
Ok, một điều tôi đã không nhận được lần đầu tiên, và do đó câu trả lời của tôi: chức năng gọi lại có thể đến từ một thư viện C/FORTRAN hoặc nó có thể là một hàm gốc Python. Đó là trường hợp? –
@Ricardo, Đúng vậy. Xin lỗi tôi có thể không nói rõ điều này. Basilcaly, nếu hàm xuất phát từ thư viện C/FORTRAN, nó được lưu trữ dưới dạng đối tượng _FuncPtr, nếu hàm này được viết bằng Python nguyên gốc, nó có thể được lưu dưới dạng CFunctionType (bằng cách sử dụng kiểu C). Tôi cho rằng những gì tôi đang thực sự yêu cầu là nếu có bất kỳ cách nào để đưa bất kỳ/tất cả những điều này vào một con trỏ hàm C trong wrapper? – SimpleSimon