C扩展库中回调Python函数
发布时间:2020-12-16 07:48:18 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 // c 程序 段static PyObject *gc_before_extract = NULL;/// 设置回调static PyObject *SetBeforeCallbackFn(PyObject *dummy,PyObject *args){PyObj
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 // 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 rn"); nRetVal = PyInt_AsLong(pRetVal); fprintf(stderr,"PyEval_CallObject : return : %d rn",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; } /////// 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" 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |