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 –
請幫幫我!如果有人知道?! –