python不在孤单,轻易而举的为python写C/C++第三方库。

我们都知道python很慢,特别是处理大数据的时候,简直慢到极致,如果在知道代码的瓶颈的时候,可以将需要大量计算的数据块放在C/C++代码里运算,然后再将数据返回给python。对,这也让python易于扩展,这样我们可以将大部分时间放在核心的代码上。

在看过一些复杂的调用方式之后,总觉得上手不易,麻烦,细想,这完全与python的simple is better哲理违背啊,果断放弃。这几天在深圳先进研究院做项目的时候,用到了QT,然后无意中发现了SIP。官方解释是SIP is a tool for automatically generating Python bindings for C and C++ libraries(还是用原文比较好,翻译之后总觉得变味了)。起初,SIP是为了PyQt而建,不过也能为其他C/C++库生成python的代码。

就此,发现了让python调用C/C++代码的利器。这样我们就可以游刃有余的穿梭在python和C/C++代码之间了。It’s perfect。有时细想,python开发的高速度加上C/C++运行的高速度,能让JAVA汗颜了吧。不过,企业承认JAVA的稳定性还是NO.1的,我也不敢乱加评价。

那好,我们开始SIP之旅吧。

下面我是在windows下的配置,不过我没有用windows下默认的编译器,因为我发现中途遇见了各种问题,彻底让我心碎了,所以我用了mingw32.

第一步:配置环境

  • 下载mingw32
  • 下载SIP
  • 下载gunmake,在windows下运行make还需要libintl, libiconv.
最重要的是,分别将mingw32,make等bin目录放在PATH下,否则找不到make,g++等命令。

第二步:安装SIP

切换到SIP的根目录下,运行

python configure.py --platform win32-g++

指定SIP在C/C++代码时,是使用mingw32版本的编译器。

然后执行

make

make install

大功告成。

第三步:让C/C++跑起来吧

创建3个文件。

configure.py   mymath.cpp   mymath.h   mymath.sip

内容分别是:
configure.py

  1. import os
  2. import sipconfig
  3. # The name of the SIP build file generated by SIP and used by the build
  4. # system.
  5. build_file = "mymath.sbf"
  6. # Get the SIP configuration information.
  7. config = sipconfig.Configuration()
  8. # Run SIP to generate the code.
  9. cmd = " ".join([config.sip_bin, "-c", ".", "-b", build_file, "mymath.sip"])
  10. os.system(cmd)
  11. # Create the Makefile.
  12. makefile = sipconfig.SIPModuleMakefile(config, build_file)
  13. # Add the library we are wrapping.  The name doesn't include any platform
  14. # specific prefixes or extensions (e.g. the "lib" prefix on UNIX, or the
  15. # ".dll" extension on Windows).
  16. makefile.extra_libs = ["mymath"]
  17. makefile.LIBDIR.append("./")
  18. # Generate the Makefile itself.
  19. makefile.generate()

mymath.h

  1. /*
  2. define my own math library
  3. */
  4. class MyMath{
  5. public:
  6. int Add(int a, int b);
  7. int Minus(int a, int b);
  8. };

mymath.cpp

  1. #include "mymath.h"
  2. int MyMath::Add(int a, int b)
  3. {
  4. return a + b;
  5. }
  6. int MyMath::Minus(int a, int b)
  7. {
  8. return a - b;
  9. }

mymath.sip

  1. // Define the SIP wrapper to the word library.
  2. %Module MyMath
  3. class MyMath {
  4. %TypeHeaderCode
  5. #include "mymath.h"
  6. %End
  7. public:
  8. int Add(int a, int b);
  9. int Minus(int a, int b);
  10. };

执行文件下的configure.py,你可以看到生成以下文件:

mymath.sbf  sipAPIMyMath.h   sipMyMathcmodule.cpp  sipMyMathMyMath.cpp  Makefile

可以看看makefile文件的内容。

在这里需要生成mymath的静态链接库,用以下命令:

g++ -c mymath.cpp  ----->生成objective file,mymath.o
ar cr mymath.lib mymath.o ----->生成静态链接库mymath.lib

到此,离成功还有半步距离了。
然后再执行make,即生成MyMath.pyd,如果你想安装MyMath.pyd,则make install即可。

我们来看看我们扩展的C/C++库吧。

>>> import MyMath
>>> dir(MyMath)
['MyMath', '__doc__', '__file__', '__name__', '__package__']
>>> s = MyMath.MyMath()
>>> dir(s)
['Add', 'Minus', '__class__', '__delattr__', '__dict__', '__doc__', '__format__'
, '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce
__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__sub
classhook__', '__weakref__']
>>> s.Add(1, 2)
3

好,白杨到此一游。Enjoy it。具体内容请详看相应的参考文件。

-----------------打造高质量的文章 更多关注 把酒泯恩仇---------------

为了打造高质量的文章,请  推荐  一个吧。。。。谢谢了,我会写更多的好文章的。

请关注sina微博:http://weibo.com/baiyang26

把酒泯恩仇官方博客:http://www.ibaiyang.org 【推荐用google reader订阅】

把酒泯恩仇官方豆瓣:http://www.douban.com/people/baiyang26/

让python和C/C++联姻【转】的更多相关文章

  1. python中while与else的联姻

    循环使用 else 语句在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断 ...

  2. Python实现电子词典(web)

    思路: 准备配置文件setting.py,运行src/data.py,使用MySQL新建数据库并创建table,将字典数据导入到table中.编写server.py文件,建立服务端,循环接收web请求 ...

  3. Python实现电子词典(图形界面)

    Python实现电子词典(图形界面) 终端电子词典:https://www.cnblogs.com/noonjuan/p/11341375.html 文件一览: .├── client.py├── d ...

  4. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  5. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  6. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  7. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  8. 可爱的豆子——使用Beans思想让Python代码更易维护

    title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...

  9. 使用Python保存屏幕截图(不使用PIL)

    起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...

随机推荐

  1. FILE对象线程安全

    根据apue讲述: 标准的IO例程可能从它们各自的内部数据结构的角度出发,是以线程安全的方式实现的!但在线程中,如果标准 IO例程都获取它们各自的锁,那么在做一次一个字符的IO时就会出现严重的性能下降 ...

  2. org.hibernate.hql.internal.ast.QuerysyntaxException:user is not mapped [from User where user_code=? and user_password=?]

    初学者,一个很低级的错误吧! 找不到映射,最后发现没把类的Hibernate映射文件 添加到Hibernate核心配置文件中去,所以报了这个异常! 在核心文件中添加映射   <mapping r ...

  3. oracle常用运维sql语句

    1.查询dblink语句 col owner for a20col db_link for a30col username for a20col host for a30set linesize 12 ...

  4. MySQL - GROUP_CONCAT 使用方法

    如上图,我想把结果集中的三行链接成一行,则可这样写:   总结: GROUP_CONCAT函数默认是用','逗号链接,如果你加上第二个参数,则以',第二个参数值'逗号+第二个参数值链接,如下图     ...

  5. mysql查询哪个表数据量最大

    use information_schema;select table_name,table_rows from tables where table_schema='cargo_new' order ...

  6. php同一个用户同时只能登陆一个, 后登陆者踢掉前登陆者(排他登陆)

    通常用户登陆,如果没有特别的限定, 同一个用户可以同时登陆, 今天搞了一个东西限定一个用户不能同时登陆到一个系统上, 后登陆者会把前面登陆的踢出来.(有点像QQ,同个帐号不能在多个地方同时在线, 后面 ...

  7. 服务端Latex解析成图片或者HTML或者SVG方案

    Latex公式表达式在服务端进行转换成可用数据 使用语言与扩展 node.js Mathjax (文档链接) MathJax在nodejs上解决方案 mathjax/MathJax-node(GitH ...

  8. 动态规划:HDU-2542-0-1背包问题:饭卡

    解题心得: 这题就是一个简单的0-1背包问题,只不过加了一系列的限制.可以想办法消去限制,直接转换成0-1背包问题的模板形式. 需要注意的几个点:首先对于剩余的5元钱的处理可以直接在总的钱数上将5减去 ...

  9. HOJ 13845 Atomic Computer有向无环图的动态规划

    考虑任意一个数字,任何一个都会有奇怪的..性质,就是一个可以保证不重复的方案——直接简单粗暴的最高位加数字..于是,如同上面的那个题:+1.-1.0 但是考虑到65536KB的标准内存限制,会得出一个 ...

  10. FreeMarker的基础语法使用 && 心得和技巧

    FreeMarker语言 FreeMarker语言概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写. FreeMarker被设计用来生成HTML Web ...