您的位置:首页 > 运维架构 > Linux

在Linux下用C语言来编写Python模块

2017-03-01 00:00 525 查看
#环境准备

以下操作与代码在Linux Ubuntu 16.04测试通过

#下载python源代码
如果需要下载其他版本,需要自行更改对应的下载路径:

wget http://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz

#解压tar.xz
下载下来的压缩包是两层压缩后的文件,需要两次解压,依次执行:

xz -d Python-2.7.12.tar.xz
tar -xvf Python-2.7.12.tar

#配置编译Python
Okay,解压完代码后cd进入解压后的代码路径(./Python-2.7.12$),执行configure进行配置, --prefix指定安装目录:

./configure --prefix=/usr/local/python2.7

执行完之后在解压后的代码路径(./Python-2.7.12$)下执行编译安装

make
sudo make install

至此,我们得环境准备工作已经完成了,检查一下,在/usr/local/python2.7目录下有没有对应的python的头文件即可。

#用C编写Python模块
首先创建Module的c文件mytest.c,格式如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Python.h"  //该文件在/usr/local/python2.7目录下

/********************C语言主体函数Start********************/
//计算两个输入的整数的和
int add(int a, int b) {
return a + b;
}

//翻转字符串
char *reverse(char *s) {
register char t;

char *p = s;
char *q = (s + strlen(s) - 1);
while (p < q){
t = *p;
*p++ = *q;
*q-- = t;
}
return s;
}
/********************C语言主体函数End********************/
/********************封装函数Start********************/
static PyObject *
mytest_add(PyObject *self, PyObject *args) {
int res;
int a;
int b;
PyObject* retval;
//从输入参数解析出两个整型数据
res = PyArg_ParseTuple(args, "ii", &a, &b);
if (!res) {
return NULL;
}
//调用C函数进行实际操作
res = add(a, b);
//将结果转换成一个python对象返回
retval= (PyObject *)Py_BuildValue("i", res);
return retval;
}

static PyObject *
mytest_reverse(PyObject *self, PyObject *args) {
char *orignal;
//从输入参数解析出待翻转的字符串
if (!(PyArg_ParseTuple(args, "s", &orignal))) {
return NULL;
}
//调用reverse并将结果转换成python对象返回
return (PyObject *)Py_BuildValue("s", reverse(orignal));
}
/********************封装函数End********************/

/********************注册Method到Python********************/
static PyMethodDef
mytestMethods[] = {
{"add", mytest_add, METH_VARARGS},
{"reverse", mytest_reverse, METH_VARARGS},
{NULL, NULL},
};

void initmytest() {
Py_InitModule("mytest", mytestMethods);
}
/********************注册Method到Python********************/

再在mytest.c的同目录下创建一个setup.py,具体内容如下:

#!/usr/bin/env python
from distutils.core import setup, Extension
MOD = 'mytest'
setup(name=MOD, ext_modules=[Extension(MOD, sources=['mytest.c'])])

#编译安装mytest

python setup.py build
sudo python setup.py install

如果没有编译错误,至此用C来编写添加python的Module的工作已经完成了。

#测试

Python 2.7.12 (default, Feb 20 2017, 04:54:43)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mytest
>>> dir(mytest)
['__doc__', '__file__', '__name__', '__package__', 'add', 'reverse']
>>> mytest.add(2,3)
5
>>> mytest.reverse("abcdef")
'fedcba'

结果与预期相符,撒花庆祝~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: