C++开发python windows版本的扩展模块示例
测试环境介绍和准备
测试环境:
操作系统:windows10
Python版本:3.7.0
VS版本:vs2015社区版(免费)
相关工具下载:
VS版本vs2015社区版(免费)
win10SDK(安装vs2015是可以选择,如果没有安装则需要独立安装)
Python3.7.0 win32 安装文件
本示例不使用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_mymod\n");
///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.0\Lib\site-packages
 
7 扩展库调用测试
扩展库编译和按照好后我们写一个python代码来测试
 
这样我们就完成了我们第一个python扩展库的程序
 
 
相关视频教程可以观看
 
 
 
 
 

C++开发python windows版本的扩展模块示例的更多相关文章

  1. 4.1. 如何在Windows环境下开发Python

    4.1. 如何在Windows环境下开发Python 4.1. 如何在Windows环境下开发Python 4.1.1. Python的最原始的开发方式是什么样的 4.1.1.1. 找个文本编辑器,新 ...

  2. Eclipse和PyDev搭建完美Python开发环境 Windows篇

    1,安装Python Python是一个跨平台语言,Python从3.0的版本的语法很多不兼容2版本,官网找到最新的版本并下载:http://www.python.org, 因为之前的一个项目是2版本 ...

  3. [转]Windows下Python多版本共存

    https://blog.csdn.net/dream_an/article/details/51248736 Windows下Python多版本共存 Python数据科学安装Numby,pandas ...

  4. windows配置Python多版本共存

    windows配置Python多版本共存 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近Python开发蛮火的,三年前我的一个运维朋友就告诉我说Python语言将来会很火,当时 ...

  5. 如何在Windows下开发Python:在cmd下运行Python脚本+如何使用Python Shell(command line模式和GUI模式)+如何使用Python IDE

    http://www.crifan.com/how_to_do_python_development_under_windows_environment/ 本文目的 希望对于,如何在Windows下, ...

  6. Windows下Python多版本共存

    Windows下Python多版本共存 Python数据科学安装Numby,pandas,scipy,matpotlib等(IPython安装pandas) 0.0 因为公司项目,需要Python两个 ...

  7. windows下怎么解决Python双版本问题

    相信大家会在windows下会遇到Python双版本问题 当我们装了Python2和Python3时我们好只能在命令栏调出最高版本的那个低版本的难道消失了吗?今天我们就解决这个问题! 1.下载 我们在 ...

  8. windows中Python多版本与jupyter notebook中使用虚拟环境

    本人电脑是windows系统,装了Python3.7版本,但目前tensorflow支持最新的python版本为3.6,遂想再安装Python3.6以跑tensorflow. 因为看极客时间的专栏提到 ...

  9. ubuntu 上用virtualenv安装python不同版本的开发环境。

    1.用pip安装virtualenv apt-get install python-virtualenv 2.创建python2的虚拟环境,进入要创建虚拟环境的目录下,我是放在/home/pyenv/ ...

随机推荐

  1. Docker进阶之四:镜像管理

      一.什么是镜像? 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统. 二.镜像从哪里来? Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容 ...

  2. Python 里的「单分派泛函数」到底是什么?

    泛型,如果你学过Java ,应该对它不陌生吧.但你可能不知道在 Python 中(3.4+ ),也可以实现简单的泛型函数. 在Python中只能实现基于单个(第一个)参数的数据类型来选择具体的实现方式 ...

  3. DSAPI 简单WebAPI实现

    使用DSAPI实现一个简单的WebAPI功能,以便各客户端访问.支持身份验证,支持基础防护. 新建项目(以下演示控制台示例),引用DSAPI.dll. 复制粘贴以下代码: Module Module1 ...

  4. 了解AJAX

    1.如何打开终端的快捷键 Window+R==>CMD==>ipconfig 动态页面:跟后台发生数据交互的页面. 前后台数据交互依赖的一项技术叫 ajax. 1. js的异步操作 (1) ...

  5. rabbitmq之基本原理及搭建单机环境

    1.RabbitMQ基本原理 1.MQ全称Message Queue,是一种分布式应用程序的通信方法,是消费-生产者模型的典型代表,producer向消息队列中不断写入消息,而另一端consumer则 ...

  6. SQL SERVER 2012 AlwaysOn - 操作系统层面 01

    搭建 AlwaysOn 是件非常繁琐的工作,需要从两方面考虑,操作系统层面和数据库层面,AlwaysOn 非常依赖于操作系统,域控,群集,节点等概念: DBA 不但要熟悉数据库也要熟悉操作系统的一些概 ...

  7. SQL Server 取日期时间格式 日期与字符串之间的转换

    SQL Server 取日期时间部分   在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate()  用DateName()就可以获得相应的 ...

  8. Java Memory Management

    How Memory works in Java The role of the stack - Each time you call a function, Java pushed the loca ...

  9. 桌面远程连接阿里云服务器(windows)后丧失了双向文件复制粘贴功能的解决方案(第一条博客!)

    近日应公司要求,需在windows服务器上架设一个交易中介软件. 过程之一:将软件压缩文件传到服务器上. 问题:在“运行”对话框通过输入'mstsc' 创建远程连接以后,出现本地桌面与服务器之间无法物 ...

  10. eclipse导入maven项目,但无法编译的问题

    同事今天从git 导入项目到eclipse 后,发现项目所依赖的包找不到依赖,初步判定是maven的依赖没有导入项目中. 最终发现,在项目中的.classpath 文件加入以下代码即可解决问题. &l ...