python如何调用c编译好可执行程序
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生成扩展模块分为以下几步:
- 将需要调用的代码编译成目标文件(.o);
- 用SWIG读取编写描述文件 (.i) ,生成接口文件 (.cxx) ;
- 将接口文件编译为目标文件(.o);
- 将接口文件的目标文件和原代码段的目标文件一起编译成动态库;
假设有如下文件
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编译好可执行程序相关推荐
- python编译成c代码_python如何调用c编译好可执行程序
以下总结出几种在Python 中调用 C/C++ 代码的方法 -------------------------------------------------------------------- ...
- linux系统下Opencv4.1.1编译安装,以及增加子函数和python中调用
目录 Table of Contents 目录 一 源码编译和安装 添加opencv路径 二 增加并列子函数的方法 三 增加库函数形参的方法 四 cv增加子函数一些数据变量的问题 4.1 数据类型 一 ...
- python 动态编译代码_使用PyQt(Python+Qt)+动态编译36行代码实现的计算器
PyQt是基于跨平台的图形界面C++开发工具Qt加Python包装的一个GPL软件(GPL是GNU General Public License的缩写,是GNU通用公共授权非正式的中文翻译),Qt基于 ...
- SQLite 版本引发的 Python 程序调用问题
问题 在跑 OpenStack functional 功能测试的时候有两个用例过不去. nova.tests.functional.db.test_resource_provider.Resource ...
- python如何调用图片-python调用图片
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python本身也有识别图片转文字的框架,但是相比调用接口,识别的精度就略显不行 ...
- python源代码不需要编译成什么-编译 Python 源代码
为什么可以/需要编译 通常在 Windows 下安装软件,只需要下载可执行文件,一直下一步就可以完成安装.而 Linux 下,你可以获取软件的源代码,自行编译生成可执行文件进行安装.用源代码有什么好处 ...
- python怎么调用方法_python中怎么调用自己的方法
展开全部 C/C++对Python的调用2113层次可5261以分为三个层次, (1) 高层次的调用, (2)纯Python调用, (3) Python方法的4102扩展(也就使向Python输出调用 ...
- Python之调用JS的方式
一.前言 日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页源代码.通过调式,然后一层一层剥离出关键的 JS 代码,使用 Python 去执行这段代码,得出参数加密前后的 ...
- python 2.7导入arcpy_[ArcPy Tips-2]给ArcPy换个家,用外部Python环境调用ArcPy
前言 Python可以调用GDAL,opencv这些库,如果能和ArcPy弄到一起联合编程,搞一个All-in-one的解决方案,想必是很优美的. 但是ArcGIS自带的Python不带pip,笔者尝 ...
最新文章
- 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现
- iOS从零开始学习直播之2.采集
- Codeforces Round #504 E - Down or Right 交互题
- 第六届北京八大处新春祈福庙会大年初一迎客
- C语言(CED)判断一个数是否是2的整数幂的简便方法!
- 《算法图解》——狄克斯特拉算法
- NVIDIA官方指南:libav编译支持Nvidia Codec(结果失败)
- mysql忘记密码重新设置步骤详解
- iTunes安装不了怎么办(win7安装iTunes)..
- java计算机毕业设计基层党支部建设平台源码+mysql数据库+系统+lw文档+部署
- 毕业设计 基于JavaWeb的奖学金评定管理系统
- 【伸手党福利】【第一弹】jeecg-boot前端主要更改位置(网站标题栏图标、logo、登录后的logo、显示的标题文字、用户头像)
- pip 查看某个包有哪些版本
- 吴恩达 深度学习系列--卷积神经网络(Convolutional Neural Networks)-03(目标检测)
- IE8:像用Windows一样用浏览器
- HFSS低版本如何打开高版本的文件
- html中常用颜色代码
- Win7下VS2008破解方法
- 单例,恶汉式 demo
- PCL点云库——关键点