C擴展庫中回調Python函數

eex2 9年前發布 | 2K 次閱讀 C/C++ Python

// c 程序 段
static PyObject *gc_before_extract = NULL;

/// 設置回調 static PyObject SetBeforeCallbackFn(PyObject dummy, PyObject args) { PyObject temp = NULL;

if (PyArg_ParseTuple(args, "O:set_callback", &temp)) { if (!PyCallable_Check(temp)) { PyErr_SetString(PyExc_TypeError, "parameter must be callable"); } Py_XINCREF(temp); / Add a reference to new callback / Py_XDECREF(gc_before_extract); / Dispose of previous callback / gc_before_extract = temp; / Remember new callback / }

return Py_BuildValue("l", (gc_before_extract == NULL) ? 0 : 1); }

/// 調用上面函數設置的python腳本函數 int BeforeExt(char pBeforeExtract) { PyObject pArgs = NULL; PyObject* pRetVal = NULL; int nRetVal = 0;

pArgs = Py_BuildValue("(s)", pFileName); pRetVal = PyEval_CallObject(gc_before_extract, pArgs); if (pRetVal) { fprintf(stderr, "PyEval_CallObject : ok \r\n"); nRetVal = PyInt_AsLong(pRetVal); fprintf(stderr, "PyEval_CallObject : return : %d \r\n", nRetVal); } Py_DECREF(pArgs); Py_DECREF(pRetVal); return nRetVal; }

/// 測試函數 static PyObject my_test_callback(PyObject self, PyObject args) { PyObject arglist; PyObject * result = NULL;

BeforeExt("good");

result = PyEval_CallObject(gc_before_extract, args); if (result) { Py_DECREF(result); } Py_INCREF(Py_None); return Py_None; }</pre>

/////// python 腳本
from pyArchive import 
from ctypes import 

回調函數必須有一個int型的返回值

def set_callback_fn(abc) : print "t_callback_fn say : {0}".format(abc) return 11

CMPFUNC = CFUNCTYPE(c_int, c_char_p) _callback = CMPFUNC(set_callback_fn)

if SetBeforeCallbackFn(_callback):
    print "set call back ok"
    my_test_callback("script call : good luck")
else :
    print "set call back fail"</pre> 


 本文由用戶 eex2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!