位置: 编程技术 - 正文

Python调用C++程序的方法详解(python如何调用c程序)

编辑:rootadmin

推荐整理分享Python调用C++程序的方法详解(python如何调用c程序),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python 调用 c,python 调用 c,python调用c语言程序,python调用c++sdk,python调用c程序,python 调用 c,python调用c程序,python 调用c++程序,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

大家都知道Python的优点是开发效率高,使用方便,C++则是运行效率高,这两者可以相辅相成,不管是在Python项目中嵌入C++代码,或是在C++项目中用Python实现外围功能,都可能遇到Python调用C++模块的需求,下面列举出集中c++代码导出成Python接口的几种基本方法,一起来学习学习吧。

原生态导出

Python解释器就是用C实现,因此只要我们的C++的数据结构能让Python认识,理论上就是可以被直接调用的。我们实现test1.cpp如下

编译命令如下

运行Python解释器,测试如下

这里要注意一下几点

如果生成的动态库名字为test1,则源文件里必须有inittest1这个函数,且Py_InitModule的第一个参数必须是“test1”,否则Python导入模块会失败 如果是cpp源文件,inittest1函数必须用extern "C"修饰,如果是c源文件,则不需要。原因是Python解释器在导入库时会寻找initxxx这样的函数,而C和C++对函数符号的编码方式不同,C++在对函数符号进行编码时会考虑函数长度和参数类型,具体可以通过nm test1.so查看函数符号,c++filt工具可通过符号反解出函数原型

通过boost实现

我们使用和上面同样的例子,实现test2.cpp如下

其中BOOST_PYTHON_MODULE的参数为要导出的模块名字

编译命令如下

注意: 编译时需要指定boost头文件和库的路径,我这里分别是/usr/local/include和/usr/local/lib

或者通过setup.py导出模块

Extension的第一个参数为模块名,第二个参数为文件名

执行如下命令

这时会生成build目录,找到里面的test2.so,并进入同一级目录,验证如下

Python调用C++程序的方法详解(python如何调用c程序)

导出类

test3.cpp实现如下

注意:BOOST_PYTHON_MODULE里的.def使用方法有点类似Python的语法,等同于

编译命令如下

测试如下

导出变参函数

test4.cpp实现如下

这里Add和Del函数均采用了默认参数,Del为普通函数,Add为类成员函数,这里分别调用了不同的宏,宏的最后两个参数分别代表函数的最少参数个数和最多参数个数

编译命令如下

测试如下

导出带Python对象的接口

既然是导出为Python接口,调用者难免会使用Python特有的数据结构,比如tuple,list,dict,由于原生态方法太麻烦,这里只记录boost的使用方法,假设要实现如下的Python函数功能

即对传入的list每个元素计算平方,返回list类型的结果

代码如下

编译命令如下

测试如下

boost实现了boost::python::tuple, boost::python::list, boost::python::dict这几个数据类型,使用方法基本和Python保持一致,具体方法可以查看boost头文件里的boost/python/tuple.hpp及其它对应文件

另外比较常用的一个函数是boost::python::make_tuple() ,使用方法如下

总结

标签: python如何调用c程序

本文链接地址:https://www.jiuchutong.com/biancheng/380017.html 转载请保留说明!

上一篇:python中import学习备忘笔记(python import怎么用)

下一篇:python3+PyQt5实现使用剪贴板做复制与粘帖示例

  • 房子税票是什么意思
  • 综合税率的计算方法是什么
  • 权益法核算转成本法
  • 个人所得税中的综合所得包括哪些
  • 捐赠支出需要什么手续
  • 总分机构是什么
  • 企业所得税属于地方税吗
  • 增值税税差怎么算
  • 进项和销项税额需要结转吗
  • 进项税额转出冲红
  • 主营业务成本可以暂估吗
  • 利润表季报本月金额是本季度余额吗
  • 开票没有网络可以开票吗
  • 收到预付款项发票如何入账?
  • 客户已经抵扣的发票怎么开负数发票给对方
  • 税控盘上开完发票发的邮件在哪查看
  • 房产税应当计入什么科目
  • 公司车辆过户给公司需要交哪些税
  • 取得甲供材料按简易征收发票能抵扣吗
  • 合并往来分录
  • 这个月只开了销项负数怎么办
  • 代扣代征税款有哪些
  • 收到项目资本金可以记到实收资本吗
  • 应纳税所得额怎么理解
  • 质押的应收票据怎么做账
  • 刚毕业的学生可以买学生票吗
  • PHP:mb_regex_encoding()的用法_mbstring函数
  • 马齿苋的功效与作用的功能与主治与用量
  • 使用php进行mysql数据库编程的基本步骤
  • php编程风格规范要求
  • 电商快递费怎么算
  • PHP:mcrypt_enc_get_modes_name()的用法_Mcrypt函数
  • 进口的应税消费品,于报关进口时缴纳消费税
  • 坎伯兰森林西部
  • 接受捐赠和对外捐赠分录
  • 政府基金如何开立账户
  • 个人转让土地使用权可以开专票吗
  • 分页显示怎么实现
  • php判断包含指定内容
  • 中华人民共和国禁毒法第十三条规定
  • 应交税费案例分析题
  • 纳税人应按照当期可抵扣进项税额的10%
  • ubuntu20.04vim
  • 主营业务收入和营业外收入均属于收入
  • 会计凭证销毁年限
  • 增值税及附加税计算公式
  • 优惠券会计分录怎么做
  • 研发支出计入产品成本吗
  • 工会经费的开支必须取得发票么
  • 土地承包经营合同生效条件
  • 清理固定资产是什么意思
  • 暂估未取得发票汇缴纳税调增怎么填
  • 记账凭证背面贴原始凭证图片
  • 购入的无形资产加计扣除怎么算
  • 残保金是公司交还是员工交
  • 公示信息有误如何修改
  • 请问在哪里可以买到震楼器
  • win9什么时候发布的
  • 如何关闭windows更新
  • 手机苹果操作系统
  • linux pwdx命令
  • linux防火墙放行
  • win7怎么看最近访问位置
  • windows 10 build 9834
  • 在操作系统中如何创建一个新的用户
  • macos终端命令
  • windows资源管理器在哪个文件夹
  • js explode
  • shell脚本 定义变量
  • 源码分析怎么写
  • vue异步加载第三方库
  • IEnumerator/ IEnumerable/ yield return/ StartCoroutine 详解
  • Linux 中常用的几种压缩工具?
  • 用shell写一个脚本,对文本中无序的一列数字排序
  • python cookie session
  • 推荐一些非常不好的书
  • jquery全选和全不选效果
  • android 蓝牙数据传输
  • 什么是12366
  • 宏观经济十大因素有哪些
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设