加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读