在Linux下用C语言来编写Python模块
2017-03-01 00:00
525 查看
#环境准备
#下载python源代码
如果需要下载其他版本,需要自行更改对应的下载路径:
#解压tar.xz
下载下来的压缩包是两层压缩后的文件,需要两次解压,依次执行:
#配置编译Python
Okay,解压完代码后cd进入解压后的代码路径(./Python-2.7.12$),执行configure进行配置, --prefix指定安装目录:
执行完之后在解压后的代码路径(./Python-2.7.12$)下执行编译安装
至此,我们得环境准备工作已经完成了,检查一下,在/usr/local/python2.7目录下有没有对应的python的头文件即可。
#用C编写Python模块
首先创建Module的c文件mytest.c,格式如下:
再在mytest.c的同目录下创建一个setup.py,具体内容如下:
#编译安装mytest
如果没有编译错误,至此用C来编写添加python的Module的工作已经完成了。
#测试
结果与预期相符,撒花庆祝~~~~~
以下操作与代码在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'
结果与预期相符,撒花庆祝~~~~~
相关文章推荐
- Linux下怎么将自己编写的Python模块添加到PYTHONPATH上
- 用C语言编写Python扩展模块
- 【Python】用C语言编写Python模块
- linux python守护进程编写
- linux中模块的编写
- Linux/FreeBSD下用C语言开发PHP的so扩展模块例解
- C语言调用Python模块(Ubuntu Linux)
- 用c/c++编写可被python导入的模块
- linux下的C语言开发(makefile编写)
- 在python中使用c语言扩展模块的简单示例
- python知识积累(五)——编写模块
- Linux/FreeBSD下用C语言开发PHP的so扩展模块例解
- 开始学习编写linux2.6.15的模块
- Linux下安装python模块时缺少Python.h
- linux python 视频设备控制模块 openCV 编译安装与测试
- 用swig给Python增加Linux下的IPC模块
- linux 内核模块 和 驱动程序的编写(1)
- Linux/FreeBSD下用C语言开发PHP的so扩展模块例解
- Linux/FreeBSD下用C语言开发PHP的so扩展模块例解
- Linux下python lxml模块的安装