pythonextension_PythonCExtension

pythonextension_PythonCExtension

2023年7月3日发(作者:)

pythonextension_PythonCExtensionC 扩展什么情况下扩展Python 没有的额外功能改善性能瓶颈隐藏专有代码,当然也可以⽤PYC什么情况不该扩展必须编写C代码需要理解C与PYTHON之间的数据传递需要⼿动的管理引⽤⽰例创建C代码上⼲货 exten_c.c#include#include#includeint fac(int n){if (n<2) return(1);return n * fac(n-1);}char *reserve(char *s){register char t,*p = s,*q = (s + strlen(s) - 1);while(p < q){t = *p;*p++ = *q;*q-- = t;}return s;}void main(){char s[BUFSIZ];char *w = "abcdefg";printf("4!=%dn", fac(4));strcpy(s, w);printf("Reserve string %s to %sn", w, reserve(s));}Make sure the c code could be right and accessiable and run sucessfully.根据样板编写封装代码python 与 C之间是通过⼀套C的库来完成相互之间的数据传递的。其⽬录为: /usr/include/python[23].X/, 可以得到所有所需的函数m import setup, ExtensionMOD=”extest”setup(name=MOD, ext_modules=[Extension(MOD, sources=[‘exten_c.c’])])封装后的代码为:#include#include#include#includeint fac(int n){if (n<2) return(1);return n * fac(n-1);}char *reserve(char *s){register char t,*p = s,*q = (s + strlen(s) - 1);while(p < q){t = *p;*p++ = *q;*q-- = t;}return s;}// 必须⽤static PyObject 来声明⾃⼰的函数//必须使⽤ modulename_functionname 的格式定义函数static PyObject *extest_fac(PyObject *self, PyObject *args) {int res; //parse resultint num; // fac parameterPyObject *retval; //return valueres = PyArg_ParseTuple(args, "i", &num);//获取python传进来的参数,并转化成C可以使⽤的类型// 具体python的数据类型与C的数据类型对应关系,需要参照对照表if (!res) {return NULL;}res = fac(num); //执⾏真正的C函数retval = (PyObject*)Py_BuildValue("i", res);// 转换C的结果成python可以识别的类型return retval;}static PyObject *extest_rev1(PyObject *self, PyObject *args) {char *orig_str;char *dupe_str;PyObject *retval; //return valueif (!PyArg_ParseTuple(args, "s", &orig_str)) return NULL;retval = (PyObject*)Py_BuildValue("ss", orig_str, dupe_str=reverse(strdup(orig_str)));free(dupe_str);return retval;}//必须使⽤PyMethodDef去声明,static PyMethodDef extestMethods[] = {{ "fac", extest_fac, METH_VARARGS }, // {python中的函数名称, 对应的封装函数,返回的值}{ "rev1", extest_rev1, METH_VARARGS },{ NULL, NULL},};//python2.7可以编译成功, python3需要更改PyMODINIT_FUNC initextest(void) {Py_InitModule("extest", extestMethods);// {python module的名称,对应的module⽅法列表}}创建安装脚本#!/usr/bin/env pythonfrom import setup, ExtensionMOD="extest"setup(name=MOD, ext_modules=[Extension(MOD, sources=['exten_c.c'])])编译与安装python setup buildpython setup install使⽤#> python>>> import extest>>>dir(extest)['__doc__', '__file__', '__name__', '__package__', 'fac', 'rev2']>>>(4)24

发布者:admin,转转请注明出处:http://www.yc00.com/web/1688382231a129624.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信