2015-04-23 94 views
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限制或我使用了一个错误的方法吗? 谢谢!

+0

Python版本2.6.6 –

+0

请帮帮我!如果有人知道?! –

回答

0

=运算符在python中重新分配一个变量。换句话说,你改变了变量的含义。

您需要更改变量指向的内容。因为它是一个ctypes指针,所以你需要用0索引它来做到这一点。

 
    def qa_callback(result): 
     result[0] = 1025 
     return 88 

注意结果后[0]

参见:https://docs.python.org/2/library/ctypes.html#pointers

相关问题