资讯专栏INFORMATION COLUMN

C++开发python windows版本的扩展模块示例

junfeng777 / 2126人阅读

摘要:主要是库文件头文件文件不一致的问题。定义模块函数其中函数参数是模块自身,是传递的参数列表,返回值定义了一个整形数,这里会申请空间增加引用计数,交由来管理这个引用。

C++开发python windows版本的扩展模块示例
测试环境介绍和准备
测试环境:
操作系统:windows10
Python版本:3.7.0
VS版本:vs2015社区版(免费)
相关工具下载:
VS版本vs2015社区版(免费)
win10SDK(安装vs2015是可以选择,如果没有安装则需要独立安装)
Python3.7.0 win32 安装文件
http://ffmpeg.club/python
本示例不使用vs来编辑,但需要安装vs的编译环境,直接用python的distutils进行编译安装,注意这里安装的python是32位的,所以编译出来库也是32位程序。
首先要检测系统中是否有其他python版本,防止冲突
进入python命令行
import sys
print(sys.path)

查看下当前系统路径是否正确,如果是其他路径的版本,可能会对的扩展库开发产生影响。主要是库文件、头文件、dll文件不一致的问题。
1 头文件和库文件
首先创建文件 mymod.c 在文件中添加头文件引用
头文件引用 #include "Python.h",库文件不需要指定,头文件路径在python的安装路径。

2 定义模块函数
其中函数参数 self是模块自身,args是python传递的参数列表,返回值定义了一个整形数0,这里会申请空间增加引用计数,交由python来管理这个引用。这里也可以返回NULL,python会收到一个异常。

include "Python.h"

///模块函数
static PyObject testmod(PyObject self,PyObject*args)
{
//返回python的long整形,c语言中引用计数+1,返回值交由python释放
return PyLong_FromLong(0);
}

3 申明模块函数(开放给python)
第一个函数名称,就是开放给python的名称,不一定要与c语言的函数名称一致,但还是尽量一致,方便跟进代码;
第二个是函数指针,默认类型就是PyCFunction函数指针类型,也就是上面的函数类型;
第三个参数是开放给python的函数参数类型,这里我们设置的无参数METH_NOARGS,还可以设置METH_VARARGS 多个参数,METH_KEYWORDS key value参数,设置为METH_KEYWORDS必须与METH_VARARGS一起设置 METH_KEYWORDS|METH_VARARGS ,并且模块函数会增加一个参数存放传进来的参数字典;
第四个参数是函数说明,在python中调用help函数可以读取;
这个定义是一个数据,可以设置多个函数PyMethodDef定义对象
/// 模块函数列表
static PyMethodDef mymod_funcs[] = {
{
"testmod", //函数名称
testmod, //函数指针
METH_NOARGS,//参数标识 无参数,
"testmod function." //函数说明 help(testmod)
},
{0,0,0,0} //数组结尾,可以申请多个函数
};

4 模块定义
///4 模块定义
static PyModuleDef mymod_module = {
PyModuleDef_HEAD_INIT,
"mymod", //模块名
"mymod is first module test", //模块说明 通过help(模块名)
-1, //模块空间,子解释器用,-1不使用
mymod_funcs //模块函数,前面定义的函数申明数组
};

5 添加入口函数
其中PyMODINIT_FUNC 宏在windows中是
PyMODINIT_FUNC __declspec(dllexport) PyObject*,
也就是入口的动态链接库函数,不同于ctypes库,扩展库只有入口函数需要定义__declspec(dllexport)导出函数符号,其他的函数不需要。
PyModule_Create创建python的模块,参数是前面定义的模块,返回直接返回模块对象,在python中所有类型都可以转为PyObject
///1 扩展库入口函数 PyInit_ 固定的开头 mymod模块名
PyMODINIT_FUNC PyInit_mymod(void)
{
printf("PyInit_mymodn");
///2 模块创建函数 参数 PyModuleDef
return PyModule_Create(&mymod_module);
}

6 编译安装
创建一个文件setup.py
第一行代码导入setup库,其中name是打包的库说明的.egg-info的文件名
version=“1.0” 这个说明文件名的后缀,如果不设置后缀会默认0.0.0
ext_modules=[Extension("mymod", ["mymod.c"] )] 中mymode是对应的模块名称和模块文件名,["mymod.c"]里面是编译为库的源文件,可以是多个文件,这里是一个python的list数组。
from distutils.core import *
setup(
name="mymod", #打包文件名称 库说明文件的文件名
version="1.0",
ext_modules=[Extension("mymod", ["mymod.c"] )]
)

最后运行命令 python setup.py install

编译成功,在当前路径下会生成一个build目录,里面是编译好的内容,应为运行了install命令,所以不仅做了编译还有安装。
扩展库安装的路径:F:Python-3.7.0Libsite-packages

7 扩展库调用测试
扩展库编译和按照好后我们写一个python代码来测试


这样我们就完成了我们第一个python扩展库的程序

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29726.html

相关文章

  • C++开发python windows版本扩展模块示例

    摘要:主要是库文件头文件文件不一致的问题。定义模块函数其中函数参数是模块自身,是传递的参数列表,返回值定义了一个整形数,这里会申请空间增加引用计数,交由来管理这个引用。 C++开发python windows版本的扩展模块示例测试环境介绍和准备测试环境:操作系统:windows10Python版本:3.7.0VS版本:vs2015社区版(免费)相关工具下载:VS版本vs2015社区版(免费)...

    Meathill 评论0 收藏0
  • 机器视觉、模式识别库汇总

    摘要:十开放模式识别项目开放模式识别项目,致力于开发出一套包含图像处理计算机视觉自然语言处理模式识别机器学习和相关领域算法的函数库。 一、开源生物特征识别库 OpenBROpenBR 是一个用来从照片中识别人脸的工具。还支持推算性别与年龄。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、计算机视觉库 OpenCVOpenC...

    habren 评论0 收藏0
  • Hyperledger Fabric(入门)

    摘要:脚本列出了在结束时安装的映像。在不同的体系结构,将用标识体系结构的字符串替换。提供了许多来支持各种编程语言,官方发布了两款针对和的和文档。。 入门 在我们开始之前,如果你还没有这样做,你可能希望检查是否已经在开发区块链应用程序和/或运行Hyperledger Fabric的平台上安装了所有前提条件。 一旦安装了前提条件,就可以下载并安装HyperLedger Fabric了,当我们在F...

    SKYZACK 评论0 收藏0
  • python大佬养成计划----HTML网页设计<二>

    摘要:但是语言并没有成功,究其原因,认为是其非开标识放造成的。已经成为最受欢迎的程序设计语言之一。年月,该语言作者在邮件列表上宣布将于年月日终止支持。其中很重要的一项就是的缩进规则。设计定位的设计哲学是优雅明确简单。 文本标签 换行标签 -- br 是单标签,意味着它没有结束标签。起强制换行作用 段落中的文字段落中的文字段落中的文字 水平分割线 -- hr 与br相同,也是单标签。可用来区分...

    jiekechoo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<