python如何调用c编译好可执行程序

(2012-08-27 20:34:51)

转载
标签:

杂谈

分类:学习

以下总结出几种在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生成扩展模块分为以下几步:

  1. 将需要调用的代码编译成目标文件(.o);
  2. 用SWIG读取编写描述文件 (.i) ,生成接口文件 (.cxx) ;
  3. 将接口文件编译为目标文件(.o);
  4. 将接口文件的目标文件和原代码段的目标文件一起编译成动态库;

假设有如下文件

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

  swig_ex.h 原始代码的头文件

  swig_ex.iSWIG描述文件

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

%moduleswig_ex
%{
   #define SWIG_FILE_WITH_INIT
   #include "swig_ex.h"
%}
intfact(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调用了:

Importswig_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编译好可执行程序相关推荐

  1. python编译成c代码_python如何调用c编译好可执行程序

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

  2. linux系统下Opencv4.1.1编译安装,以及增加子函数和python中调用

    目录 Table of Contents 目录 一 源码编译和安装 添加opencv路径 二 增加并列子函数的方法 三 增加库函数形参的方法 四 cv增加子函数一些数据变量的问题 4.1 数据类型 一 ...

  3. python 动态编译代码_使用PyQt(Python+Qt)+动态编译36行代码实现的计算器

    PyQt是基于跨平台的图形界面C++开发工具Qt加Python包装的一个GPL软件(GPL是GNU General Public License的缩写,是GNU通用公共授权非正式的中文翻译),Qt基于 ...

  4. SQLite 版本引发的 Python 程序调用问题

    问题 在跑 OpenStack functional 功能测试的时候有两个用例过不去. nova.tests.functional.db.test_resource_provider.Resource ...

  5. python如何调用图片-python调用图片

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python本身也有识别图片转文字的框架,但是相比调用接口,识别的精度就略显不行 ...

  6. python源代码不需要编译成什么-编译 Python 源代码

    为什么可以/需要编译 通常在 Windows 下安装软件,只需要下载可执行文件,一直下一步就可以完成安装.而 Linux 下,你可以获取软件的源代码,自行编译生成可执行文件进行安装.用源代码有什么好处 ...

  7. python怎么调用方法_python中怎么调用自己的方法

    展开全部 C/C++对Python的调用2113层次可5261以分为三个层次, (1) 高层次的调用, (2)纯Python调用, (3) Python方法的4102扩展(也就使向Python输出调用 ...

  8. Python之调用JS的方式

    一.前言 日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页源代码.通过调式,然后一层一层剥离出关键的 JS 代码,使用 Python 去执行这段代码,得出参数加密前后的 ...

  9. python 2.7导入arcpy_[ArcPy Tips-2]给ArcPy换个家,用外部Python环境调用ArcPy

    前言 Python可以调用GDAL,opencv这些库,如果能和ArcPy弄到一起联合编程,搞一个All-in-one的解决方案,想必是很优美的. 但是ArcGIS自带的Python不带pip,笔者尝 ...

最新文章

  1. 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现
  2. iOS从零开始学习直播之2.采集
  3. Codeforces Round #504 E - Down or Right 交互题
  4. 第六届北京八大处新春祈福庙会大年初一迎客
  5. C语言(CED)判断一个数是否是2的整数幂的简便方法!
  6. 《算法图解》——狄克斯特拉算法
  7. NVIDIA官方指南:libav编译支持Nvidia Codec(结果失败)
  8. mysql忘记密码重新设置步骤详解
  9. iTunes安装不了怎么办(win7安装iTunes)..
  10. java计算机毕业设计基层党支部建设平台源码+mysql数据库+系统+lw文档+部署
  11. 毕业设计 基于JavaWeb的奖学金评定管理系统
  12. 【伸手党福利】【第一弹】jeecg-boot前端主要更改位置(网站标题栏图标、logo、登录后的logo、显示的标题文字、用户头像)
  13. pip 查看某个包有哪些版本
  14. 吴恩达 深度学习系列--卷积神经网络(Convolutional Neural Networks)-03(目标检测)
  15. IE8:像用Windows一样用浏览器
  16. HFSS低版本如何打开高版本的文件
  17. html中常用颜色代码
  18. Win7下VS2008破解方法
  19. 单例,恶汉式 demo
  20. PCL点云库——关键点

热门文章

  1. 我现在的简历以及后面的更改方向
  2. Hd2087 剪花布条
  3. 基于Java的全文索引
  4. OPPO R11发布盛典昨晚举行,精彩程度不亚于大型晚会!
  5. Task Runner Explorer for vs2015找不到啊
  6. 更多Java之行内容,需要看直播请关注微薄
  7. Windows下MySql安装【图文】
  8. jQuery实战读书笔记(第五章)
  9. Http响应码及其含义--摘自apache官网
  10. 判断一个点是否在指定三角形内(1)