通过C来扩展Python

Python是一门通过C语言写出来的动态语言。那么可以通过C语言对Python3的库进行扩展。

主要的流程是通过C语言实现一些方法和功能,然后使用Python.h的文件功能,将C语言实现的功能进行包装,通过gcc编译城*.so的库文件。然后在python的代码中import编译成功的库,就可以调用库里面的方法了。

下面是C的代码:

首先,通过c语言定义几个函数fact(), zero()和add()。然后对这几个函数进行包装,在本文例子中是通过wrap_fact(),wrap_zero()和wrap_add()将三个函数包装。文件存为main.c(名字可以随便定义为*.c)

#include <Python.h>

int fact(int n)
{
  if (n <= 1)
    return 1;
  else
    return n * fact(n - 1);
}

void zero()
{
    int result = 0;
}    

int add(int a, int b)
{
    return a+b;
}

PyObject* wrap_fact(PyObject* self, PyObject* args)
{
  int n, result;

  if (! PyArg_ParseTuple(args, "i", &n))
    return NULL;
  result = fact(n);
  return Py_BuildValue("i", result);
}

PyObject* wrap_zero(PyObject* self, PyObject* args)
{
    if(!PyArg_ParseTuple(args, ""))
        return Py_BuildValue("", NULL);
    zero();
    return Py_BuildValue("", NULL);

}

PyObject* wrap_add(PyObject* self, PyObject* args)
{
    int a, b;
    if (!PyArg_ParseTuple(args, "ii", &a, &b))
       return Py_BuildValue("i", 0);
    int result = add(a, b);
    return Py_BuildValue("i", result);
}
static PyMethodDef exampleMethods[] =
{
  {"fact", wrap_fact, METH_VARARGS, "Caculate N!"},
  {"zero", wrap_zero, METH_VARARGS, ""},
  {"add", wrap_add, METH_VARARGS, ""},
  {NULL, NULL}
};

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

接着,通过gcc -fPIC -o example.so -shared -I/usr/include/python2.7 main.c 将文件编译为example.so的库

接下来,通过在python中导入原来的库就可以将原来文件进行调用了。

import example

print example.fact(4)
example.zero()
print example.add(3,4)
时间: 2024-10-25 08:55:06

通过C来扩展Python的相关文章

22 扩展Python - 《Python 核心编程》

?? 引言/动机 ?? 扩展 Python ?? 创建应用程序代码 ?? 用样板包装你的代码 ?? 编译 ?? 导入并测试 ?? 引用计数 ?? 线程和 GIL ?? 相关话题 22.1 介绍/动机 什么是扩展 一般来说,所有能被整合或导入到其它python 脚本的代码,都可以被称为扩展.您可以用纯 Python 来写扩展,也可以用C 和C++之类的编译型的语言来写扩展(或者也可以用Java 给Jython 写 扩展,也可以用C#或Visual Basic.NET 给IronPython 写扩展

使用c/c++扩展python

用python脚本写应用比较方便,但有时候由于种种原因需要扩展python(比如给程序提供python接口等). 之前一直想整理下,今天终于坐下来把这件事情给做了,这里记录下,也方便我以后查阅. 说明: 测试环境中操作系统为CentOS6.5_x64,python版本为2.6 直接调用动态库 1.编写模块动态库文代码 这里以求最大数为示例 代码(callTest1.cpp)如下: extern "C" { int Max(int i1,int i2) { return (i1>i

初用C/C++扩展Python,提高性能

前段时间写了两篇文章介绍如何提高Python的运行效率,一篇是从python语言本身的角度去介绍的,另一篇是从解释器角度(利用PyPy),有兴趣的可以找着看看.从另外一个角度来介绍如何提高python运行效率,那就是利用c/c++来扩展python提高性能.我们知道python官方网站上下载的python解释器源码是用c语言编写的,所以,也可以利用c/c++来扩展它,以获得较优的执行性能.Python提供了API接口,是我们很方便的能进行扩展,所有这些API都包含在Python.h的头文件里,在

使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments

使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python来调用有点不一样(虽然本质是一样的).而是指使用Python本身提供的API,使用C++来对Python进行功能性扩展,可以这样理解,使用更高效的语言实现一些算法计算等等需要更高执行效率的核心(或者需要与系统进行密切交互的)模块,然后让Python像调用内建标准库的方式来调用这些模块,听起来是不是很

python学习(十七) 扩展python

c, c++, java比python快几个数量级. 17.1 考虑哪个更重要 开发速度还是运行速度更重要. 17.2 非常简单的途径:Jython和IronPython Jython可以直接访问JAVA标准库. IronPython中可以直接访问C#标准库. 17.3 编写C语言扩展 扩展Python通常就是扩展CPython,是用c语言实现的标准Python版本. 17.3.1 SWIG swig是简单包装和接口生成器的缩写,是一个能用于几种语言的工具.一方面,可以通过它使用c语言或者C++

扩展Python模块系列(一)----开发环境配置

本系列将介绍如何用C/C++扩展Python模块,使用C语言编写Python模块,添加到Python中作为一个built-in模块.Python与C之间的交互目前有几种方案: 1. 原生的Python C/C++ API, 官网有非常详细的文档说明 2. boost python,一个C++的编程框架,对官方API进行了封装,可以方便的用C++扩展Python模块,省去了很多诸如引用计数的烦恼. http://www.boost.org/doc/libs/1_64_0/libs/python/d

[Python自动化]使用C来扩展Python

一.需求背景 Python 几乎能解决你所遇到的所有问题,但 Python 常被人提及的问题就是速度问题,这时如果想提升 Python 的速度,基本都会使用 C/C++ 来扩展 Python 接口,这种方法仅仅是提升 Python 速度的诸多方法中的一种而已. 同时,对于一些使用 Python 来解决的问题比较棘手时,也可以考虑使用 C/C++ 来扩展 Python 接口,这样在调用的时候,就会减少一些 Python 带来的麻烦. 基于不同的平台,使用 C/C++ 扩展 Python 接口时,产

扩展Python模块系列(五)----异常和错误处理

在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_DECREF.在编写C语言代码时,需要了解Python提供的C/C++ API的实现细节,特别是有的API内部实现会调用Py_INCREF,这时自己编写的函数可能需要调用Py_DECREF,而有的API内部实现只是borrowed reference,此时一般不应该调用Py_DECREF. 本节讨论

【转】用C语言扩展Python的功能

原作者:肖文鹏 ([email protected]),原文地址:http://www.ibm.com/developerworks/cn/linux/l-pythc/ Pyton和C分别有着各自的优缺点,用Python开发程序速度快,可靠性高,并且有许多现成模块可供使用,但执行速度相对较慢:C语言则正好相反,其执行速度快,但开发效率低.为了充分利用两种语言各自的优点,比较好的做法是用Python开发整个软件框架,而用C语言实现其关键模块.本文介绍如何利用C语言来扩展Python的功能,并辅以具

利用boost.python 通过c++语言来扩展python (python.boost)

python语言的优良性就不多说了,我想提下如何使用boost.python,通过boost.python既可以将python转移到C++上,通过Python库,也可以通过C++来扩展python,下面主要介绍使用boost.python来扩展python的功能,第一次用boost.python,倒腾了半天才搞定: 首先列出我的测试环境: 我用的是VS2010,python2.7,我用VS2010创建了一个windows DLL的项目,项目名称为pylib,在DLL main中加入如下代码: /