1.环境:
win10、VS2017、Anaconda3(python2.x) (切换python2环境:activate python27)
2.步骤:
2.1.新建一个空文件目录,新建文件great_module.c
#include <Python.h>
int great_function(int a) {
return a + 1;
}
static PyObject * _great_function(PyObject *self, PyObject *args)
{
int _a;
int res;
if (!PyArg_ParseTuple(args, "i", &_a))
return NULL;
res = great_function(_a);
return PyLong_FromLong(res);
}
static PyMethodDef GreateModuleMethods[] = {
{
"great_function",
_great_function,
METH_VARARGS,
""
},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initgreat_module(void) {
(void) Py_InitModule("great_module", GreateModuleMethods);
}
注:
(1)包裹函数_great_function。它负责将Python的参数转化为C的参数(PyArg_ParseTuple),调用实际的great_function,并处理great_function的返回值,最终返回给Python环境。
(2)导出表GreateModuleMethods。它负责告诉Python这个模块里有哪些函数可以被Python调用。导出表的名字可以随便起,每一项有4 个参数:第一个参数是提供给Python环境的函数名称,第二个参数是_great_function,即包裹函数。第三个参数的含义是参数变长,第四个 参数是一个说明性的字符串。导出表总是以{NULL, NULL, 0, NULL}结束。
(3)导出函数initgreat_module。这个的名字不是任取的,是你的module名称添加前缀init。导出函数中将模块名称与导出表进行连接。
3.编译
cl /LD great_module.c /o great_module.pyd -I C:\APP\Anaconda3\envs\python27\include C:\APP\Anaconda3\envs\python27\libs\python27.lib
/LD 即生成动态链接库。编译成功后在当前目录可以得到 great_module.pyd(实际上是dll)。这个pyd可以在Python环境下直接当作module使用
4.运行
参考:
【1】:https://zhuanlan.zhihu.com/p/20150641?refer=python-dev
【2】:http://blog.csdn.net/ivan_ljf/article/details/52563914