$ gcc Extest1.c -o Extest
$ ./Extest
4! = 24
/usr/local/include/python2.x
或者 /usr/include/python2.x
中。/usr/include/python3.6
中Python.h
这个头文件包含在源码中#include "Python.h"
fatal error: Python.h: No such file or directory compilation terminated.
。sudo apt-get install python3-dev
static PyObjuec*
标识,以模块名开头,紧接着是下划线和函数名本身的函数。fac()
函数可以在Python中导入,并将Extest
作为最终的模块名称,需要创建一个名为Extest_fac
的封装函数。在用到这个函数的Python脚本中,可以使用import Extest
和 Extest.fac()
的形式在任意地方调用fac()
函数。python3 setup.py build
initModule
这个函数。解决方案见上distutils
模块No module named 'distutils.core'
。解决方案sudo apt-get install python3-distutils
$ python3 setup.py install
Permission denied
,所以这里用 sudo python3 setup.py install
就可以了。int PyArg_ParseTuple(PyObject *arg, const char *format, ...);
函数fac()
的示例中,当客户程序调用Extest.fac(
)时,会调用封装函数。这里会接受一个Python整数,将其转换成C整数,接着调用C函数fac(),获取返回结果,同样是一个整数。将这个返回值转换成Python整数,返回给调用者(记住,编写的封装函数就是def fac(n)声明的代理函数。当这个封装函数返回时,就相当于Python fac()函数执行完毕了)。PyArg_Parse*()
. C->Python : Py_BuildValue()
PyArg_Parse*()
: 类似于C中的sscanf
函数。接受一个字节流,然后根据一些格式字符串进行解析,将结果放入到相应指针所指的变量中。若解析成功就返回1;否则返回0.Py_BuildValue()
:类似于 sprintf
函数,接受一个格式字符串,并将所有参数按照格式字符串指定的格式转换成一个Python 对象。格式编码 | Python数据类型 | C/C++数据类型 |
---|---|---|
s, s# | str/unicode, len() | char*, int |
i | int | int |
b | int | char |
c | str | char |
d | float | double |
h | int | short |
l | int | long |
#include "Python.h"
int ok;
int i, j;
long k, l;
const char *s;
Py_ssize_t size;
ok = PyArg_ParseTuple(args, ""); /* No arguments */
/* Python call: f() */
ok = PyArg_ParseTuple(args, "s", &s); /* A string */
/* Possible Python call: f('whoops!') */
ok = PyArg_ParseTuple(args, "lls", &k, &l, &s); /* Two longs and a string */
/* Possible Python call: f(1, 2, 'three') */
ok = PyArg_ParseTuple(args, "(ii)s#", &i, &j, &s, &size);
/* A pair of ints and a string, whose size is also returned */
/* Possible Python call: f((1, 2), 'three') */
{
const char *file;
const char *mode = "r";
int bufsize = 0;
ok = PyArg_ParseTuple(args, "s|si", &file, &mode, &bufsize);
/* A string, and optionally another string and an integer */
/* Possible Python calls:
f('spam')
f('spam', 'w')
f('spam', 'wb', 100000) */
}
{
int left, top, right, bottom, h, v;
ok = PyArg_ParseTuple(args, "((ii)(ii))(ii)",
&left, &top, &right, &bottom, &h, &v);
/* A rectangle and a point */
/* Possible Python call:
f(((0, 0), (400, 300)), (10, 10)) */
}
setup.py
。参考书籍:
《Python核心编程》Unit8
百度网盘链接:https://pan.baidu.com/s/1XYSY65_BuQkEHm-LFzzi3g 提取码:awqc
《Python3文档》https://docs.python.org/3/ 这篇文章主要需要用到的文档内容上面已经给了