2015-04-23 86 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

相關問題