以下总结出几种在Python 中调用 C/C++ 代码的方法

--------------------------------------------------------------------

发现做便捷的是使用popen

from os import popen

popen('/home/pengyan/Downloads/VIC/sanxia/vicNl -g /home/pengyan/Downloads/VIC/sanxia/xings_global')

popen('/home/pengyan/Downloads/VIC/sanxia/rout /home/pengyan/Downloads/VIC/sanxia/xings_rout')

?? 目前还不会用python 切换文件目录

可以采用绝对路径,但是好像绝对路径时,计算速度变慢

-------------------------------------------------------------------

使用ctypes 模块调用 C 动态库

从Python2.5 开始, Python 开始提供 ctypes 模块来提供对 C 语言编译的动态库文件的调用。注意, 这里特指C 的动态库 ,用C++ 编译的动态库 ctypes 虽然能够加载,但调用时的函数名已经由于 C++ 的重载特性被加以修改,难以调用。 使用 ctypes 调用 C 动态库的好处在于不用进行额外的开发,可以直接使用编译好的动态库。 ctypes 提供了完整的 C 类型封装,也支持自定义类型,大大减少在调用过程中的工作量。 ctypes 的使用很简单,只需熟悉 python 封装与 C 中的对应关系即可。以下用一个简单的例子来说明:

from ctypes import * #导入ctypes模块

libc = cdll.LoadLibrary("libc.so.6") #加载libc动态库

str = c_char_p(' Hello World! ') #使用char *在ctypes中的对应封装c_char_p,相当于char* str=”Hello World!”

libc.printf(“yell: %s\n”, str ) #调用printf函数

ctypes的功能当然远不止这些,有兴趣的同学可以参考这里 http://docs.python.org/library/ctypes.html

使用Python 的扩展( Extending )机制

ctypes很方便地可以调用 C 的动态库,但是对 C++ 编译的动态库,调用起来很困难。这种情况利用 Python 的 Extending 机制就可以解决。 Python 提供了一套完整的框架来使用 C/C++ 编写扩展库,可以很灵活的开发 C++ 扩展模块。这种方法的缺点是工作量比较大,需要为每一个方法编写接口,这里不做详细介绍,可以参考: http://docs.python.org/extending/extending.html#writing-extensions-in-c

那么有什么办法可以高效的调用C++ 动态库呢,答案是 SWIG 。

使用SWIG 生成扩展模块

上面提到了Python 的扩展机制,缺点是工作量比较大,这里介绍一个工具 SWIG 。 SWIG 是一种简化脚本语言与 C/C++ 接口的开发工具,通过包装和编译 C 语言程序来达到与脚本语言通讯目的的工具。它正是基于 Python 的扩展机制,自动生成接口文件,再编译成可以被 Python 调用的动态库扩展模块。

使用SWIG 生成扩展模块分为以下几步:

将需要调用的代码编译成目标文件(.o) ;

用SWIG 读取编写描述文件 (.i) ,生成接口文件 (.cxx) ;

将接口文件编译为目标文件(.o) ;

将接口文件的目标文件和原代码段的目标文件一起编译成动态库 ;

假设有如下文件

swig_ex.cpp 需要转换成扩展库的原始代码,包含一个int fact(int) 函数

swig_ex.h 原始代码的头文件

swig_ex.i SWIG描述文件

swig_ex.i是一个描述文件,有 SWIG 自己的语法,比较简单,内容如下:

%module swig_ex

%{

#define SWIG_FILE_WITH_INIT

#include "swig_ex.h"

%}

int fact(int n);

再写一个Makefile 来把这些文件编译成动态库 :

all: swig_ex.o swig_ex_wrap.o _swig_ex.so

swig_ex.o: swig_ex.cpp swig_ex.h #编译源文件

g++ -fPIC -c swig_ex.cpp

swig_ex_wrap.o: swig_ex.i swig_ex.o #根据 SWIG 描述文件 (.i) 生成接口文件 (.cxx) ,再编译之

swig -c++ -python swig_ex.i

g++ -O2 -fPIC -c swig_ex_wrap.cxx -I/home/work/linyi/autoframe/tool/python/include/python2.6/

_swig_ex.so: swig_ex_wrap.o #将目标文件打包成动态库

g++ -shared swig_ex.o swig_ex_wrap.o -o _swig_ex.so

.PHONY: clean

clean:

rm -rf swig_ex_wrap.* swig_ex.py _swig_ex.so

编译好以后会有一个so 和 py 文件,写一个 setup.py 把他们安装到 python 目录就可以和其他模块一样被 python 调用了:

Import swig_ex

swig_ex.fact(10)

参考文档地址:http://www.swig.org/Doc1.3/SWIGDocumentation.html

原始但有效的方法

除了上面这些方法,在Python 中借用 C/C++ 代码最原始有效的方法就是将代码编译成可执行程序,从 Python 里用 Popen 方法来调用获取输出。这种方法简单有效,缺点是不够灵活,有比较大的局限性,不过在很多情况下也已经足够了。

pipe = os.popen('./tool –a %s –b %s' % (“hello”, “world”))

re = pipe.read()

其他方法

以上这些方法基本上已经能满足Python 调用 C/C++ 的需求了,此外还有一些方法,例如使用 Boost.Python ,使用 Pyrex ,这些方法都能提供 Python 与 C/C++ 的交互。

总结

在Python 中引用 C/C++ 模块的方法较多,根据需要从中选择恰当的方法可以减少很多工作量。

在Python 中引用 C/C++ 模块弥补了 Python 脚本测试框架的很多不足,在提高代码复用率的同时,模块的性能也大大提高。

python编译成c代码_python如何调用c编译好可执行程序相关推荐

  1. python转go_如何看待将Python代码转换成Go代码并进一步编译的 Grumpy 项目?

    明确声明了的,以及可以预见到的与 CPython 的区别有: 1,不会完全兼容现在 Python 的全部特性,比如 eval 语句.这点没有办法,因为是 AOT 编译器,运行时生成代码只能放弃了.其实 ...

  2. python解释器把python代码一次性翻译成目标代码_Python语言程序设计----【第1周 Python基本语法元素】之1.1 程序设计基本方法...

    第1章 Python基本语法元素 1.1 程序设计基本方法 1.2 Python 开发环境配置 1.3 实例1:温度转换 1.4 Python程序语法元素分析 1.1 程序设计基本方法 计算机的概念: ...

  3. python动态运行py代码_Python 动态执行

    Python 动态执行 2015-06-16 Tuesday 在 Python 中,允许通过 exec 和 eval 执行以字符串形式表示的代码片段,这体现了动态语言的特性,可以让代码变得更灵活.实际 ...

  4. python多线程执行同样代码_Python 多线程、多进程 (一)之 源码执行流程、GIL

    一.python程序的运行原理 许多时候,在执行一个python文件的时候,会发现在同一目录下会出现一个__pyc__文件夹(python3)或者.pyc后缀(python2)的文件 Python在执 ...

  5. python点餐系统代码_Python学习手册(第4版).1

    装饰器就是一个给对象添加额外功能的函数,其本质是函数.它的基本构造:高阶函数+函数嵌套+闭包. 装饰器 即在代码运行期间动态增加功能的方式. 3大条件: 1. 函数可作为对象,赋值给变量,也就是函数可 ...

  6. python鸭制作类代码_Python动态语言与鸭子类型详解

    今天来说说编程语言中的动态类型语言与鸭子类型. 动态语言 维基百科对动态语言的定义: 动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其 ...

  7. python股票分析系统代码_Python 代码学习,用于股票分析

    最近,一位常年研究股票系统的开发者 pythonstock 用 Python 写了一个股票分析系统,发布数天就获得了不少关注. 于是我们就推荐给大家,既能学习 python 又能练习炒股.但正如项目作 ...

  8. python画旺仔代码_python基础1

    python解析 1:Python语言是符号跟文字的组合,目的是用来向计算机发送指令,控制计算机工作 2:Python解释器是运行在操作系统之上的一个特殊功能的应用程序 3:解释器负责将变成语言的符号 ...

  9. python中空格的代码_python 空格

    初学python,不明白代码之间时空格的用处 比如: print "Hens", 25 + 30 / 6 print"hens",25+30/6 一个有空格一个 ...

最新文章

  1. 第二十四课:能量和功率
  2. 探讨微软团队开发利器VSTS之安装及部署篇
  3. 设计模式学习笔记--解释器模式
  4. Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题
  5. Spring AOP编程-aspectJ注解开发(@Pointcut声明切点)
  6. IE通过推理IE陈述的版本号
  7. 像postman上传文件_90%的测试工程师是这样使用Postman做接口测试的……
  8. TP框架中的A方法和R方法
  9. 一个人如果没有计划,那和咸鱼有什么区别!
  10. 原来程序员成长的关键竟然是它?!
  11. 双11你玩AR捉猫猫游戏了吗?来看看游戏背后的项目实战经验吧
  12. 网上找了c#仓库管理程序,编译的时候一直 报错
  13. 考研篇:如何在偶数年数学120+(刷同样的题,为什么有人的分数会更高?)
  14. 知识点滴 - 大麦、小麦、燕麦和荞麦的区别
  15. 好用的电台APP推荐|这些年,陪伴我上下班的声音
  16. vb冒泡排序法流程图_vb数组排序-冒泡排序法
  17. 怎样恢复计算机到桌面,电脑任务栏怎么还原到下面 电脑任务栏还原方法【图文】...
  18. 海思入门笔记二:HiBurn工具实现镜像烧写
  19. Linux日志文件系统(EXT4、XFS、JFS)及性能分析
  20. Python 计算思维训练——字典与字符串练习(一)

热门文章

  1. alwayson 增加节点_用于AlwaysON高可用性的域控制器和域客户端节点设置
  2. MySQL 定时任务event 按天建表 并将前一天数据导入新建的表中并删除总表数据 实现分表功能
  3. 虚拟机安装---vm12+ubuntukylin16.04
  4. BTREE这种Mysql默认的索引方式,具有普遍的适用性
  5. swift 计算label的行数方法
  6. delphi IOS 通知 TNotification
  7. 知道世界越大,就会觉得你越小
  8. css 输入框 按钮 对齐,CSS让input button元素对齐的代码收集
  9. 深度学习-CNN tensorflow 可视化
  10. Angular提示文件不是一个有效的模块