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

简介:
用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



目录
相关文章
|
17天前
|
存储 开发者 Python
Python中的collections模块与UserDict:用户自定义字典详解
【4月更文挑战第2天】在Python中,`collections.UserDict`是用于创建自定义字典行为的基类,它提供了一个可扩展的接口。通过继承`UserDict`,可以轻松添加或修改字典功能,如在`__init__`和`__setitem__`等方法中插入自定义逻辑。使用`UserDict`有助于保持代码可读性和可维护性,而不是直接继承内置的`dict`。例如,可以创建一个`LoggingDict`类,在设置键值对时记录操作。这样,开发者可以根据具体需求定制字典行为,同时保持对字典内部管理的抽象。
|
19天前
|
存储 缓存 算法
Python中collections模块的deque双端队列:深入解析与应用
在Python的`collections`模块中,`deque`(双端队列)是一个线程安全、快速添加和删除元素的双端队列数据类型。它支持从队列的两端添加和弹出元素,提供了比列表更高的效率,特别是在处理大型数据集时。本文将详细解析`deque`的原理、使用方法以及它在各种场景中的应用。
|
4天前
|
Python
python学习14-模块与包
python学习14-模块与包
|
5天前
|
SQL 关系型数据库 数据库
Python中SQLite数据库操作详解:利用sqlite3模块
【4月更文挑战第13天】在Python编程中,SQLite数据库是一个轻量级的关系型数据库管理系统,它包含在一个单一的文件内,不需要一个单独的服务器进程或操作系统级别的配置。由于其简单易用和高效性,SQLite经常作为应用程序的本地数据库解决方案。Python的内置sqlite3模块提供了与SQLite数据库交互的接口,使得在Python中操作SQLite数据库变得非常容易。
|
11天前
|
索引 Python
「Python系列」Python operator模块、math模块
Python的`operator`模块提供了一系列内置的操作符函数,这些函数对应于Python语言中的内建操作符。使用`operator`模块可以使代码更加清晰和易读,同时也能提高性能,因为它通常比使用Python内建操作符更快。
27 0
|
15天前
|
数据采集 网络协议 API
python中其他网络相关的模块和库简介
【4月更文挑战第4天】Python网络编程有多个流行模块和库,如requests提供简洁的HTTP客户端API,支持多种HTTP方法和自动处理复杂功能;Scrapy是高效的网络爬虫框架,适用于数据挖掘和自动化测试;aiohttp基于asyncio的异步HTTP库,用于构建高性能Web应用;Twisted是事件驱动的网络引擎,支持多种协议和异步编程;Flask和Django分别是轻量级和全栈Web框架,方便构建不同规模的Web应用。这些工具使网络编程更简单和高效。
|
19天前
|
数据采集 数据挖掘 Python
Python中collections模块的Counter计数器:深入解析与应用
在Python的`collections`模块中,`Counter`是一个强大且实用的工具,它主要用于计数可哈希对象。无论是统计单词出现的频率,还是分析数据集中元素的分布情况,`Counter`都能提供快速且直观的结果。本文将深入解析`Counter`计数器的原理、用法以及它在实际应用中的价值。
|
20天前
|
Python
Python中的math和cmath模块:数学运算的得力助手
Python作为一种功能强大的编程语言,提供了丰富的数学运算功能。其中,math和cmath模块就是Python中用于数学运算的重要工具。math模块提供了基本的数学函数和常量,适用于实数运算;而cmath模块则提供了对复数运算的支持,使得Python在数学计算和工程应用中更加灵活和强大。
|
23天前
|
数据挖掘 Python
Python中的datetime模块:轻松拿捏时间操作
Python的`datetime`模块是处理日期和时间的核心工具,包括`date`、`time`、`datetime`、`timedelta`类。它可以创建、操作和格式化日期时间。
19 2
|
25天前
|
Python
Python random模块(获取随机数)常用方法和使用例子
`random`模块在Python中用于生成随机数。
21 0