编写Python扩展
1. 创建应用代码
-
编写一个比较简单的函数,求阶乘。并且写上main函数进行测试。
-
编译测试
$ gcc Extest1.c -o Extest
$ ./Extest
4! = 24
2. 根据样板编写封装代码
- 先给个文档地址:Extending Python with C or C++
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 Extest
和Extest.fac()
的形式在任意地方调用fac()
函数。 - 封装函数的任务是将Python中的值转成C形式,接着调用相应的函数。当C函数执行完毕时,需要返回Python的环境中。封装函数需要将返回值转换成Python形式,并进行真正的返回,传回所有需要的值。
2.3 为每一个模块函数添加一个PyMethodDef ModuleMethods[] 数组/表
- 这边书里《Python核心编程》和文档稍微有点出入,书里是3个参数,文档是4个参数,但是文档没有写第4个参数是什么,所以这边先按书里写的。
2.4 添加模块初始化函数
- 书里是这么写的,我怀疑是python2和3的区别,所以这里书里的不太对,我这边在后面的运行中会出现问题,所以这里稍微改一下。用文档的内容。
- 文档里的初始化格式: