环境配置¶
首先找到Python的include files,并加入IntelliSense的path中。还要找到numpy的include files,在site-packages里面。
我们可以这样调用Python的C++包
#include <Python.h>
下面是一些numpy的include
#include <Python.h>
#include <numpy/arrayobject.h>
How to extend Numpy¶
“主函数”¶
定义函数¶
这一节考虑mymethods的编写,它通常static声明为一个PyMethodDef的数组,官方文档的例子如下。
static PyMethodDef mymethods[] = {
{ nokeywordfunc,nokeyword_cfunc,
METH_VARARGS,
Doc string},
{ keywordfunc, keyword_cfunc,
METH_VARARGS|METH_KEYWORDS,
Doc string},
{NULL, NULL, 0, NULL} /* Sentinel */
}
每一个PyMethodDef对象需要包含以下东西
- 在Python中的名字
- 对应在C中的函数名字
- flags indicating 函数是否要接受keyword
- 函数的docstring
值得注意的是最后需要整一个NULL作为哨兵结点。
没有Keyword arguments的函数¶
不接受keyword arguments的函数需要向下面这样写
static PyObject*
nokeyword_cfunc (PyObject *dummy, PyObject *args)
{
/* convert Python arguments */
/* do function */
/* return something */
}
这里的这个args包含传进来的所有参数,放在一个tuple中。常用的两个处理方式如下
PyArg_ParseTuple (args, format_string, addresses_to_C_variables…)PyArg_UnpackTuple (tuple, “name”, min, max, …)
下面是一个用PyArg_ParseTuple的例子
PyObject *input;
PyArray_Descr *dtype;
if (!PyArg_ParseTuple(args, "OO&", &input, PyArray_DescrConverter, &dtype)) return NULL;
dtype中会有一个新的指向一个PyArray_Descr*对象的引用,然而input中会有一个borrowed的引用。