C++代码生成python扩展库案例

代码

func1modext.cpp

#include "Python.h"
//#include <opencv2\highgui\highgui.hpp>
//#include <opencv2\imgproc\imgproc.hpp>
//#include <opencv2/imgproc/types_c.h>


//5.模块函数
static PyObject* func1(PyObject* self, PyObject * args)
{
	//返回python的Long整形,c语言中引用计数加1,返回值交由python释放
	/*
	int i;
    dobule d;
    char *s;
    if(!PyArg_ParseTuple(args, "ids", &i, &d, &s))
    {
        return NULL;
    }
	*/
	/*
	    int a;
    int b;
    if(!PyArg_ParseTuple(args, "ii", &a, &b))
    {
        return NULL;
    }
    return Py_BuildValue("i", a+b);
	*/
	return PyLong_FromLong(101);
}

//4.模块函数列表数组
static PyMethodDef func1mod_funcs[] = {
	{
		"func1",   //函数名称
		func1,    //函数指针
		METH_NOARGS,   //参数标识 无参数 //元组参数 METH_VARARGS //关键字参数METH_VARARGS|METH_KEYWORDS
		"test func1 function"   //函数说明 help(func1)
	},
	{0,0,0,0}
};

//3.模块定义
static PyModuleDef func1mod_module = {
	PyModuleDef_HEAD_INIT,
	"func1modext" ,		 //模块名
	"func1modext is test",			 //模块说明,通过help(模块名)
	-1,					//模块空间,子解释器调用,-1不使用
	func1mod_funcs		 //模块函数
};

//1.扩展库入口文件 PyInit_固定的开头,func1mod模块名
PyMODINIT_FUNC PyInit_func1modext(void)
{
	printf("PyInit_func1modext\n");
	//2.模块创建 参数:PyModuleDef
	return PyModule_Create(&func1mod_module);
}

setup.py

# -*- coding:utf-8 -*-
from distutils.core import *

setup(
    name = "func1modext",  #打包文件名称
    version = "1.0",
    ext_modules = [Extension("func1modext", ["func1modext.cpp"])]
    )

写完setup.py之后,在终端运行命令(注意要在你对应的python环境下运行):python setup.py install.然后在当前目录下生成一个build文件,里面有生成好的pyd文件(pyd文件名称里会多一个cp37-win32,生成的时候自动加上的,这个可以不用管,),pyd文件其实就是一个dll文件,只是把dll的后缀名改成了pyd。python setup.py install.命令就会把这个pyd文件拷贝到python环境下的第三方库目录,比如我的是F:/Python-3.7.0/Lib/site-packages,这样你的扩展库已经做好了,这样你就可以对它使用了。

testmod.py

# -*- coding:utf-8 -*-
print("Test func1 Module")
import func1modext
print(help(func1modext))  //help函数用于获取它的信息
print(func1modext.func1())

扩展:

如果大家想深入理解,可以查看python的源码(PyObject结构分析和PyLongObject分析),在python源码中的include目录下,object.h等头文件中可以学习到。这里不深入讨论。
如果C++扩展库中需要调用第三方opencv库,相对来说比较麻烦的,你可以参考https://github.com/Algomorph/pyboostcvconverter这篇大神的工程代码,它的代码也是参考opencv源码的,可以去学习下。一般来说做扩展库的代码不要包含其他第三方的库不然实现起来比较麻烦。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值