这里介绍python3的方法,python2的方法类似,只是几个函数不一样而已。
主要是运用python.h这个头文件。
首先记得在代码前面加上下面的代码
#ifdef _DEBUG
#undef _DEBUG
#include <python.h>
#define _DEBUG
#else
#include <python.h>
#endif
如果不加的话,调试和非调试的库的问题在导入该模块时会造成下面的错误
Fatal Python error: _PyInterpreterState_Get(): no current thread state
Python runtime state: unknown
当然你也可以直接编译release版本来避免这个问题。
在编写python的模块的时候使用的标准模板为
static PyObject* function(PyObject *self, PyObject *args)
{
}
传入的参数一般使用PyArg_ParseTuple()来进行变量的转换。同样有大量Unicode和char的转换函数。
接着将所有要暴露给python的函数放入一个struct
static PyMethodDef Methods[] = {
{"functionname", functionname, METH_VARARGS, "description"},
{NULL, NULL, 0, NULL}
}
这里PyMethodDef是一个struct,我举例放入了一个函数叫funtionname,以及他的描述。
然后再将所有函数放入模块中
static PyModuleDef Module = {
PyModuleDef_HEAD_INIT, "test", NULL, -1, Methods,
NULL, NULL, NULL, NULL
};
这里我放入到了一个test的模块。
最后创建这个模块。
extern "C" __declspec(dllexport)
PyObject* PyInit_test(void)
{
return PyModule_Create(&Module);
}
这里因为需要将这个函数暴露出来所以需要加__declspec(dllexport),必须以c的方式编译不然无法找到入口函数。这里还有一点需要注意PyInit_后面点必须为模块的名字。
最后编译成pyd后缀的dll,就可以直接在python中import了。
python2的使用方式差不多,只是创建的时候的函数和中间加入模块有些许不同而已。