位置: 编程技术 - 正文

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实现使用剪贴板做复制与粘帖示例

  • 报销金额限制多少
  • 四联发票都需要盖什么章
  • 个人工作室需要注册资金吗
  • 招待客人的住宿费能抵扣吗?
  • 暂估入库发票回收怎么办
  • 没有抵扣的进项发票,开错了对方没有作废
  • 外企缴纳社保
  • 抵债资产涉税问题
  • 来料加工与进料加工的相似之处有
  • 非本单位费用列支 违反
  • 计提工会经费是按应付职工薪酬的借方还是贷方
  • 异地预缴企业所得税
  • 特定行业如何界定
  • 原材料销售出库会计分录
  • 同期对比和同比增长
  • 电子通行费如何开发票
  • 普票清单可以是专票吗
  • 税务定率征收
  • 公司员工驻外补贴政策
  • 非货币性资产是无形资产吗
  • 银行承兑汇票贴现流程
  • 劳务公司开具劳务费发票
  • 报销金额和发票金额不一致怎么做账
  • 公司股东转账进公司账户,会计分录
  • linux怎样安装
  • 工程复工程序是什么
  • 老板垫付的员工怎么入账
  • 如何用ai写代码
  • thinkphp表单验证
  • 认识数据库思维导图
  • vue指定
  • 报税扣款锁定怎么处理
  • 增值税电子普通发票怎么打印
  • 长期股权投资的账务处理
  • 高新技术企业福利费扣除比例
  • 投资公司如何注册勘察设计工程师证书
  • 保险费支出是什么意思
  • 账面未分配利润等于净利润?
  • SQLite3 命令行操作指南
  • 对公账户分类及区别
  • 进口增值税完税证明网哪里打印的
  • 费用票必须是公司发票吗
  • 经营性应收项目的减少调增 为什么是减
  • 金税四期介绍 王军
  • 疫情期间增值税减免政策截止时间
  • 棚户区改造国家给政府拨款吗
  • 知识产权fa
  • 股权转让如何缴纳个人所得税举例说明
  • 零售商品收入
  • 员工体检的发票在哪里开
  • 购买商品或服务不给开发票违法吗
  • 生产的半成品怎么做分录
  • 出售房产收入属于转让财产收入吗
  • windows update更新卡住不动了
  • docker镜像包含什么
  • linux的压缩包
  • mscorsvw.exe是什么进程
  • linux jre
  • mac safari浏览器翻译功能
  • windows10周年更新
  • linux充当虚拟内存的是哪个分区
  • win7关闭右下角操作中心
  • win10edge浏览器怎么设置兼容模式
  • 局域网下访问vue点击无反应
  • texture packer工具
  • python模拟软件
  • jquery插件使用教程
  • jquery返回顶部
  • docker编写dockerfile
  • android 加载大图
  • 分享面试流程
  • 如何用javascript
  • jquery.qtip提示信息插件用法简单实例
  • 广西税务局增值税发票查询平台
  • 生活垃圾处理合作协议
  • 广西空置房物业费减免政策吗
  • 地税局工作人员工资标准多少
  • 如何查到银行
  • 高新区地税办税服务厅
  • 烟叶进口关税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设