扩展Python之在Python中调用C编写的函数模块

编写Python扩展

1. 创建应用代码

  • 编写一个比较简单的函数,求阶乘。并且写上main函数进行测试。
    在这里插入图片描述

  • 编译测试

$ gcc Extest1.c -o Extest
$ ./Extest
4! = 24

2. 根据样板编写封装代码

2.1 包含Python头文件

  • 在大多数类UNIX系统上,Python包含文件一般位于/usr/local/include/python2.x 或者 /usr/include/python2.x 中。
  • 我的系统是ubuntu 18.04 LTS。没有python2,系统自动安装的只有python3。我的位于 /usr/include/python3.6
    在这里插入图片描述
  • Python.h 这个头文件包含在源码中
#include "Python.h"
  • 这边之后编译这个文件时可能会出现错误 fatal error: Python.h: No such file or directory compilation terminated.
    stack overflow上的解决方案
sudo apt-get install python3-dev

2.2 为每一个模块函数添加形如PyObject* Module_func() 的封装函数

  • 对于每个需要在Python环境中访问的函数,需要创建一个以static PyObjuec* 标识,以模块名开头,紧接着是下划线和函数名本身的函数。
  • 例如,若要让 fac() 函数可以在Python中导入,并将Extest 作为最终的模块名称,需要创建一个名为Extest_fac 的封装函数。在用到这个函数的Python脚本中,可以使用import ExtestExtest.fac() 的形式在任意地方调用fac() 函数。
  • 封装函数的任务是将Python中的值转成C形式,接着调用相应的函数。当C函数执行完毕时,需要返回Python的环境中。封装函数需要将返回值转换成Python形式,并进行真正的返回,传回所有需要的值。
    在这里插入图片描述

2.3 为每一个模块函数添加一个PyMethodDef ModuleMethods[] 数组/表

在这里插入图片描述

  • 这边书里《Python核心编程》和文档稍微有点出入,书里是3个参数,文档是4个参数,但是文档没有写第4个参数是什么,所以这边先按书里写的。

2.4 添加模块初始化函数

  • 书里是这么写的,我怀疑是python2和3的区别,所以这里书里的不太对,我这边在后面的运行中会出现问题,所以这里稍微改一下。用文档的内容。
    在这里插入图片描述
  • 文档里的初始化格式:
    在这里插入图片描述

3 编译并测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值