文档章节

用C语言实现python的扩展模块

MtrS
 MtrS
发布于 2015/02/27 16:36
字数 595
阅读 92
收藏 5

用C语言实现python的扩展模块 示例1:

1    Example.c
int add(int a,int b)
{
        return a+b;
}

int sub(int a,int b)
{
        return a -b;
}

int mul(int a,int b)
{
        return a*b;
}

int div1(int a,int b)
{
        if(0 == b)
        {
                return b;
        }
        return a/b;
}

2 wrap.c

#include <Python.h> //python.h中已经包含了常用的头文件
PyObject* wrap_add(PyObject* self, PyObject* args)
{
  int n1,n2, result;
 
  if (! PyArg_ParseTuple(args, "i|i", &n1,&n2))
    return NULL;
  result = add(n1,n2);
  return Py_BuildValue("i", result);
}

PyObject* wrap_sub(PyObject* self, PyObject* args)
{
  int n1,n2, result;
 
  if (! PyArg_ParseTuple(args, "i|i", &n1,&n2))
    return NULL;
  result = sub(n1,n2);
  return Py_BuildValue("i", result);
}

PyObject* wrap_mul(PyObject* self, PyObject* args)
{
  int n1,n2, result;
 
  if (! PyArg_ParseTuple(args, "i|i", &n1,&n2))
    return NULL;
  result = mul(n1,n2);
  return Py_BuildValue("i", result);
}
PyObject* wrap_div1(PyObject* self, PyObject* args)
{
  int n1,n2, result;
  if (! PyArg_ParseTuple(args, "i|i", &n1,&n2))
    return NULL;
  result = div1(n1,n2);
  return Py_BuildValue("i", result);
}


static PyMethodDef exampleMethods[] =
{
  {"add", wrap_add, METH_VARARGS, "Caculate 1!"},
  {"sub", wrap_sub, METH_VARARGS, "Caculate 2!"},
  {"mul", wrap_mul, METH_VARARGS, "Caculate 3!"},
  {"div1", wrap_div1, METH_VARARGS, "Caculate 4!"},
  {NULL, NULL,0,NULL}
};

void initexample()
{
  PyObject* m;
  m = Py_InitModule("example", exampleMethods);
}

3 编译

gcc -fpic -c -I /usr/include/python2.6/ -I /usr/lib/python2.6/config example.c wrap.c
gcc -shared -o wrap.so  wrap.o

4 功能演示截图

5 主要参考: 5.1 Python的C语言扩展 http://www.ibm.com/developerworks/cn/linux/l-pythc/ 5.2 浅谈 Python 程序和 C 程序的整合 http://www.ibm.com/developerworks/cn/linux/l-cn-pythonandc/index.html?ca=drs-cn-0506

示例2:(支持回调python中定义的函数) 1 mytest.c

#include <Python.h>
static PyObject *my_callback = NULL;
static PyObject* my_strlen(PyObject *self, PyObject *args)
{
   char *string;
   int len;
   if (!PyArg_ParseTuple(args, "s", &string))

     return NULL;
   len = strlen(string);
   return Py_BuildValue("i", len);
}

static PyObject* my_strcat(PyObject *self, PyObject *args)
{
    char* string1;
    char* string2;
    char* newstring;

    if (!PyArg_ParseTuple(args, "s|s", &string1, &string2))
        return NULL;
    newstring = strcat(string1, string2);
    return Py_BuildValue("s", newstring);
}

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

    if (PyArg_ParseTuple(args, "O", &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_test_callback(PyObject *self, PyObject *args)
{
    PyObject * arglist;
    PyObject * result = NULL;

    result = PyEval_CallObject(my_callback, args);
    if (result == NULL)
    {
        return NULL;
    }
    Py_DECREF(result);
    Py_INCREF(Py_None);
    return Py_None;
}

static PyMethodDef mytestMethods[] =
{
     {"mystrlen", my_strlen, METH_VARARGS, "We test strlen of C"},
     {"mystrcat", my_strcat, METH_VARARGS, "We test strcat of C"},
     {"mysetcallback", my_set_callback, METH_VARARGS, "we set a call back function so that call it in C"},
     {"mytestcallback", my_test_callback, METH_VARARGS, "we use this function to test call back function"},
     {NULL, NULL, 0, NULL}
};

void initmytest()
{
      (void) Py_InitModule("mytest", mytestMethods);
}

2 编译

gcc -fpic -c -I /usr/include/python2.6/ -I /usr/lib/python2.6/config   mytest.c
gcc -shared -o mytest.so  mytest.o

3 功能演示截图

4 主要参考 4.1 . Calling Python Functions from C 4.2 在windows上扩展python http://blog.chinaunix.net/space.php?uid=46552&do=blog&id=2116527 4.3 [精华] 在windows上扩展python(2)--从c中调用python函数 http://www.linuxforum.net/forum/gshowthreaded.php?Cat=&Board=python&Number=485550&page=3&view=collapsed&sb=5&o=all&vc=1

© 著作权归作者所有

共有 人打赏支持
上一篇: Django signal 信号
下一篇: Python C
MtrS
粉丝 32
博文 566
码字总数 357787
作品 0
榆林
私信 提问
C/C++ 和 Python混合编程

链接:https://www.zhihu.com/question/23003213/answer/56121859 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 #include int main(int argc, char *...

sirius_0
2018/04/21
0
0
PyPy 1.3 发布,Python 解释器

PyPy 是用Python实现的Python解释器。 改进内容:初步支持C语言写的CPython扩展模块;修正了JIT编译器bug,改进了稳定性;小幅改进了JIT代码,加快了编译时间等等。 该版本详细改进内容请看这...

红薯
2010/06/28
322
1
使用C++编写python扩展模块

简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python来调用有点不一样(虽然本质是一样的)。而是指使用Python本身提供的API,使用C++来对Python进行功能...

openthings
2015/01/21
0
0
0. Python3源码—编译

0.1. 整体架构 在最高的层次上,Python的整体架构可以分为三个主要的部分: 左:Python提供的大量的模块、库以及用户自定义的模块; 右:Python的运行时环境,包括对象/类型系统(Object/Ty...

whj0709
2018/06/06
0
0
问一个比较弱的问题:python这种语言存在的价值?

这个问题可能不只是对于python的,而是所有用一种高级编程语言实现的语言。最近在研究python源码。发现python是c语言实现的虚拟机上运行的语言,这样执行效率肯定不会超过c语言。 我对于我自...

qinuxman
2014/04/26
2.1K
20

没有更多内容

加载失败,请刷新页面

加载更多

《傲慢与偏见》的读书笔记与读后感作文2400字

《傲慢与偏见》的读书笔记与读后感作文2400字: 作者:孙苑馨;笔者按:读书这个习惯是我爸妈养出来的。小时候父母赚的钱除了吃饭穿衣剩下的就是买书了,他们除了买各种新鲜出版的文艺派图书...

原创小博客
11分钟前
0
0
oozie job 的挂了监控报警或重启

oozie Coordinator 的job 和actioni状态很多,但好像不支持设置某状态如failed后30分钟后自动重新拉启,因他的条件只有几种:触发条件可以是一个时间频率、一个dataset实例是否可用,或者可能...

hblt-j
29分钟前
1
0
python精简笔记-[6]-[if,for,while]语句

1.if 条件判断 语法: if 判断条件: 执行语句……elif 判断条件:    执行语句……elif 判断条件:    执行语句……else: 执行语句…… 实例1: n = input("请输...

平头哥-Enjoystudy
33分钟前
0
0
RxJava 是如何实现线程切换的(上)

前言 通过前一篇的从观察者模式出发,聊聊RxJava,我们大致理解了RxJava的实现原理,在RxJava中可以非常方便的实现不同线程间的切换。subscribeOn 用于指定上游线程,observeOn 用于指定下游线...

亭子happy
59分钟前
2
0
想晋级高级工程师只知道表面是不够的!Git内部原理介绍

本文由云+社区发表 作者:腾讯工蜂用户:王二卫 从不一样的视角了解git,以便更好的使用git 一、git & git 版本库认识 git 是一个内容寻址的文件系统,其核心部分是一个简单的键值对数据库(...

腾讯云加社区
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部