注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[python] Calling Python Functions from C  

2011-06-06 11:39:13|  分类: lang_python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
spam.set_callback,设置一个 callback obj,保存起来
spam.call_it,调用保存着的 callback obj

--------------------------------------------------------------------------
#include <Python.h>

#pragma comment(lib, "python27.lib")

static PyObject *my_callback = NULL;    // def func(a):

static PyObject *
my_set_callback(PyObject *dummy, PyObject *args)
{
    PyObject *result = NULL;
    PyObject *temp;

    if (PyArg_ParseTuple(args, "O:set_callback", &temp)) {
        if (!PyCallable_Check(temp)) {
            PyErr_SetString(PyExc_TypeError, "parameter must be callable");
            return NULL;
        }
        Py_XINCREF(temp);
        Py_XDECREF(my_callback);
        my_callback = temp;
        Py_INCREF(Py_None);
        result = Py_None;
    }
    return result;
}

static PyObject *
my_call_it(PyObject *dummy, PyObject *args)
{
    int arg;
    PyObject *arglist;
    PyObject *result;

    arg = 123;
    arglist = Py_BuildValue("(i)", arg);
    result  = PyObject_CallObject(my_callback, arglist);
    Py_DECREF(arglist);
    if (result == NULL)
        return NULL;
    Py_DECREF(result);

    Py_RETURN_NONE;    // Py_INCREF(Py_None); return Py_None;
}

static PyMethodDef SpamMethods[] = {
    {"set_callback", my_set_callback, METH_VARARGS, "set a callback"},
    {"call_it", my_call_it, METH_VARARGS, "call it"},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initspam(void)
{
    Py_InitModule("spam", SpamMethods);
}
--------------------------------------------------------------------------
>>> import spam
>>> def mycb(a):
...     print a
...
>>> spam.set_callback(mycb)
>>> spam.call_it()
123
>>> spam.set_callback(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: parameter must be callable
--------------------------------------------------------------------------


PyArg_ParseTuple 参数
  评论这张
 
阅读(1058)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017