创建python的c扩展

python创建扩展需要的3个步骤:

1、创建应用程序代码
2、利用模板包装源码
3、编译与测试

一、创建源码

递归求阶乘的函数fac()

#include<stdio.h>
int fac(int i){
  if(i<2) return 1;
  else return i*fac(i-1);
}
二、用模板来包装的代码

分4个步骤
1、包含Python的头文件
2、为每个模板的每一个函数增加一个形如PyObject* Module_func()的包装函数
3、为每个模板增加一个形如PyMethodDef ModuleMethos[]的数组
4、增加模块初始化函数void initModule()

补充c语言(c++)与python之间的参数传递
python到c的转换就用PyArg_Parse*()系列函数;
c到python的转换就用PyBuildValue()函数;
PyArg_Parse*()系列函数的用法跟c的sscanf()函数很像,都接受一个字符串流,并根据一个指定的格式字符串进行解析,并把结果存放在相应的指针变量上去。返回1表示解析成功,0表示解析失败。
Py_BuildValue()的用法跟sprintf()很像,把所有的参数按照格式字符串指定的格式转换一个Python对象。
Python和c/c++之间数据转换

函数描述
int PyArg_ParseTuple()把Python传过来的参数转化为c
int PyArg_ParseTupleAndKeywords()与上面的功能一样,但同时支出解析关键字参数
PyObject* Py_BuildValue()把c的数据转化为Ptyhon的一个或者一组对象,并返回之

Python和c/c++之间数据转换的通用代码

格式代码Python型c/c++类型
sstrchar*
zstr/Noechar*/NULL
iintint
llonglong
cstrchar
dfloatdouble
DcomplexPy_Complex*
O(any)PyObject*
SstrPyStringObject

则第一步的代码修改为:

//1、包含Python的头文件
#include<Python.h>
#include<stdio.h>
int fac(int i){
  if(i<2) return 1;
  else return i*fac(i-1);
}
//2、为每个模板的每一个函数增加一个形如PyObject* Module_func()的包装函数
static PyObject* test_fac(PyObject* self, PyObject* args){
  int num;
  if(!PyArg_ParseTuple(args, "i", &num))
    return NULL;
  return (PyObject*)Py_BuildValue("i", fac(num));
}
//3、为每个模板增加一个形如PyMethodDef ModuleMethos[]的数组
static PyMethodDef testMethods[]={
  {"fac", test_fac, METH_VARARGS},
  {NULL, NULL},
};
//4、增加模块初始化函数void initModule()
void inittest() {
  Py_InitModule("test", testMethods);
}
三、编译

分4步骤
1、创建setup.py
2、通过运行setup.py来编译和连接代码
3、从Python中导入模块
4、测试功能

setup.py

from distutils.core import setup, Extension
MOD='test'
setup(name=MOD, ext_modules=[
  Extension(MOD, sources=['test.c'])])

编译
python setup.py build
python setup.py install

测试:

import test
test.fac(5)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值