0
我尝试使用python ctype来调用C库(.so),并且此C库具有回调函数。 C源代码:Python - 为什么不能更改C回调函数中的值?
int showHelloword(int *result)
{
*result = 1025;
return 55;
}
void BSP_SHOW(int time,int (*callback)(int *result))
{
int ret = 44;
int boo = 4;
while(time > 0){
--time;
if(time == 0){
if(callback) {
printf("boo %d\n",boo); // I expect boo=4
ret = callback(&boo);
printf("Outfunc=%d\n",boo); // I expect Outfunc=1025
printf("ret=%d\n",ret); // I expect ret=55
}
callback = 0;
}
sleep(1);
}
}
void main(){
BSP_SHOW(2, &showHelloword);
}
打印rseult是:
boo=4
Outfunc=1025
ret=55
,它似乎还行。
的Makefile来源:
gcc -c -fPIC -Wno-format-security -g main.c
gcc -shared -o libcall.so main.o
gcc main.o -o callback -ldl -lpthread -lrt
然后,我尝试使用Python CTYPE叫 “BSP_SHOW” 这一功能,并得到回调到这个功能。 Python源:
Python版本:2.6.6
import sys
import os
import time
from ctypes import *
import struct
from Queue import *
class callback_api(object):
def __init__(self):
CDLL("/usr/lib64/librt.so",mode=RTLD_GLOBAL)
path = "/root/workspace/callback/libcall.so" `C library path`
self.dll = cdll.LoadLibrary(path)
def BSP_SHOW(self,sec, cb_func):
self.dll.BSP_SHOW.restype = None
self.dll.BSP_SHOW.argtypes = [c_int, qa_cb_prototype]
self.dll.BSP_SHOW(c_int(sec),cb_func)
def qa_callback(result):
result = 1025 #it should change the value. but the result is not....
return 88
qa_cb_prototype = CFUNCTYPE(c_int, POINTER(c_int))
qa_cache_cb_func = qa_cb_prototype(qa_callback)
if __name__ == '__main__':
api = callback_api()
api.BSP_SHOW(2,qa_cache_cb_func) `got it callback`
打印结果。
cb=4
Outfunc=4 <---I expect it should be 1025,but not!
ret=88 <---return value have been change by python callback.
有人知道这是一个python ctype限制或我使用了一个错误的方法吗? 谢谢!
Python版本2.6.6 –
请帮帮我!如果有人知道?! –