使用c++创建python自定义模块

这里介绍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的使用方式差不多,只是创建的时候的函数和中间加入模块有些许不同而已。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值