位置: 编程技术 - 正文

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 shell语句
  • Radio.exe - Radio是什么进程 有什么用
  • 公司现金用途
  • 结构性存款利息增值税
  • 增值税发票要审核成功才能开吗
  • 残疾人就业保障金有什么好处
  • vue项目难点及解决方法
  • php示例代码大全
  • php内存缓存
  • reset=target
  • 微信公众号的推送
  • 财务报表怎样调出来
  • 纳税调整项目明细表利息支出怎么填
  • 工会收到单位拨款的会计分录
  • Python数学建模三剑客
  • 美团算钱
  • 手机银行对公账户转账要手续费吗
  • 零税项目
  • 项目差旅费能计入项目费用吗
  • 家庭分割财产怎么处理
  • MySQL5.6 Replication主从复制(读写分离) 配置完整版
  • 不动产经营租赁包括哪些内容
  • 未分配利润实际没有钱分配是什么原因
  • 主营业务成本借贷方向增减
  • 工业企业土地使用税
  • 新成立公司如何报税
  • 小企业无形资产取得的账务处理
  • 单位要处置一辆车怎么办
  • mysql5.7.17下载
  • 怎样用windows
  • linux详解
  • linux系统中用户密码保存在什么文件中
  • solaris配置ip地址
  • 怎么用手机号查快递
  • mfc100udll
  • 如何查看winxp系统的运行内存
  • 怎么在ubuntu上编程
  • 两台mac怎么同步
  • windows server 2012 nfs共享
  • centos6关闭图形界面
  • macbook qq截图存在哪
  • win8的系统
  • xml文件网络传输
  • our与my的区别
  • 菜鸟教程安卓开发
  • jni静态注册和动态注册
  • shell脚本windows
  • linux shell -s
  • Jquery uploadify上传插件使用详解
  • 用python语言编写
  • 如何使用nginx
  • jquery mobile 图片滑动
  • javascript消息对话框
  • 浅谈Jquery中Ajax异步请求中的async参数的作用
  • 刷医保的网络可以用外网吗
  • 如何在电子税务局变更财务负责人
  • 如何推进社会治理
  • 河南国税发票查询真伪官网
  • 中国进口车关税为什么那么贵
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设