用C语言扩展Python

最近一直在跟随《PYTHON核心编程》学习一些python的编写,可惜的是这本书的版本太过于陈旧。大部分范例代码都是python2的版本。

刚刚在看python用C语言写扩展包的时候踩到了一个大坑,到现在没用爬上来

跟其他的python代码一样,扩展包也无非就是调包而已,要把python的数据类型转换成C语言能够兼容的数据类型,

通过C程序进行运算后,再返回成python自己的数据类型。

这里在写C程序的时候需要用到Python.h的头文件。这个一般在python所在的文件夹下。

我直接暴力拷贝到了MinGW的include目录下

Python3和Python2的写法在这里已经完全不一样了,可以参考

https://www.tutorialspoint.com/python/python_further_extensions.htm

以下是我的代码,不过失败了(苦笑)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <Python.h>
#define BUFFSIZE 1000

int fact(int n){
    if(n < 2){
        return 1;
    }
    return fact(n - 1) + fact(n - 2);
}

char* reverseString(char *origin){
     char temp;
     int length = strlen(origin);
     int end = strlen(origin)-1;
     int start = 0;
     printf("%s\n",origin);
     while (start <= end){
         temp = origin[start];
         origin[start] = origin[end];
         origin[end] = temp;
         start++;
         end--;
     }
     return origin;
}
static PyObject *ExtEx_fact(PyObject *self, PyObject *args){
    int num;    //Hold arguments of fact()
    if(!PyArg_ParseTuple(args, "i", &num)){    //parse python‘s args into C‘s int args("i")
        return NULL;
    }
    return (PyObject*)Py_BuildValue("i", fact(num));
}
static PyObject *ExtEx_reverse(PyObject *self, PyObject *args){
    char *string;
    char *temp;
    PyObject *result;
    if(!PyArg_ParseTuple(args, "s", &string)){
        return NULL;
    }
    result = (PyObject *)Py_BuildValue("ss", string, temp=reverseString(strdup(string)));
    free(temp);
    return result;
}
static PyMethodDef ExtExMethods[] = {
    {"fact", ExtEx_fact, METH_VARARGS},
    {"reverseString", ExtEx_reverse, METH_VARARGS},
    {NULL, NULL},
};
static struct PyModuleDef ExtEx = {
    PyModuleDef_HEAD_INIT,
    "ExtEx",
    NULL,
    -1,
    ExtExMethods,
    NULL,
    NULL,
    NULL,
    NULL
};
void initExtEx(){
    PyModule_Create(&ExtEx);
}

需要用到setup的python脚本进行编译

from distutils.core import setup, Extension
setup(name=‘ExtEx‘, version=‘1.0‘,        ext_modules=[Extension(‘ExtEx‘, [‘ExtEx.c‘])])

不过遇到了一个错误信息

error: Unable to find vcvarsall.bat

好像解决起来非常麻烦,可以参考StackOverflow的这个帖子

https://stackoverflow.com/questions/2817869/error-unable-to-find-vcvarsall-bat

这个帖子里第二个回答非常有用。

但是结果依旧不行,等有时间用Linux系统试一下

得到最大的教训就是这本书要粗看,细看害死人啊。

原文地址:https://www.cnblogs.com/AcodingDg/p/10165485.html

时间: 2024-10-11 00:59:17

用C语言扩展Python的相关文章

转:用C语言扩展Python的功能

转自:http://www.ibm.com/developerworks/cn/linux/l-pythc/ 一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中. 与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C++来对Python进行功能性扩展,从而即可以利用Python方便灵活

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

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

使用C语言扩展Python提供性能

python底层是用c写的,c本身是一个非常底层的语言,所以它做某些事情的效率肯定会比上层语言高一些. 比如有些自动化测试用的python库,会对系统的UI进行一些捕获,点击之类的操作,这必然要用到c,实际上这些库就是用c来扩展的.先用c写一些调用系统UI的接口,然后把它封装成python方法. 下面是一个简单的用C来扩展python的例子: test.c #include "Python.h" static PyObject *pr_getsum(PyObject *self,PyO

使用C语言扩展Python

开发环境:Ubuntu9.10,python2.6,gcc4.4.1 1,ubuntu下的python运行包和开发包是分开的,因此需要在新利得里面安装python-all-dev,从而可以在代码中引用python的头文件和库. 2.下面是一个最简单的可以供python调用的c扩展模块,假设c程序文件名为foo.c: 代码 #include <Python.h> static PyObject* foo_bar(PyObject* self, PyObject* args) {    Py_RE

使用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模块系列(五)----异常和错误处理

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

Python:C语言扩展

1. 概述 Python 可以非常方便地和 C 进行相互的调用. 一般,我们不会使用 C 去直接编写一个 Python 的模块.通常的情景是,我们需要把 C 的相关模块包装一下,然后在 Python 中可以直接调用它.或者是,把 Python 逻辑中的某一效率要求很高的部分使用 C 来实现.整个过程大概是: 引入 Python.h 头文件. 编写包装函数. 函数中处理从 Python 传入的参数. 实现功能逻辑. 处理 C 中的返回值,包装成 Python 对象. 在一个 PyMethodDef

windows 下 使用codeblocks 实现C语言对python的扩展

本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自http://blog.csdn.net/yueguanghaidao/article/details/11538433 一直对Python扩展很感兴趣,刚好看到了Extending and Embedding the Python Interpreter文档,看的是最低版本(由于工作中用的是2.x, ̄□ ̄),官方文档 链接:http://docs.python.org/2.6/extending/index.html 我使用的IDE是Co

利用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中加入如下代码: /