红联Linux门户
Linux帮助

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

发布时间:2017-03-22 15:46:18来源:linux网站作者:crazyskady
环境准备
以下操作与代码在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'
 
结果与预期相符。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/29389.html