文档章节

使用SIP对C库进行Python封装

openthings
 openthings
发布于 2015/02/05 17:03
字数 1821
阅读 793
收藏 5
点赞 0
评论 0

    Python中使用C/C++模块有许多工具,大名鼎鼎的有SWIG(英文意思为:豪饮)、SIP(英文意思为:啜饮,小口的喝),还有 boost.python等。其中SIP是从SWIG发展而来,专为Python调用C/C++模块使用的(看SIP的命名就能看出来,很有意思的)。

        SIP的使用方法,在官网的SIP Reference Guide中有介绍,不过那是针对至少有点经验的人员,对初学者来说,想十分钟快速上手还是有点难度的。这里就介绍下本人在使用SIP总结的需要注意的地 方。(本着方便大家方便自己的原则,欢迎转载,无需征得本人同意,但请注明出处,最好是原文连接,图个人气,谢谢!)

        前提,本机上要装了Python、GCC(Windows下可以用MinGW,在我的Eclipse下配置CDT一文中有关于MinGW的安装介绍)。并把python.exe和MinGW下的bin文件路径添加到环境变量中。

第一部分:安装SIP

        Windows:

        将Riverbank上的sip的zip格式的代码包下载,将其解压到C:\Python27中,那么现在sip的文件夹路径为C: \Python27\sip-4.13.2\sip-4.13.2(你也可以将其解压到任何一个文件夹中,但这里为了叙述方便,就解压到我电脑上的 Python的文件夹中)。

        打开Windows的cmd命令行,输如cd C:\Python27\sip-4.13.2\sip-4.13.2跳转到sip文件夹下。  

        输入python configure.py --platform win32-g++。进行配置,显示结果如下:

        再完成上一步后,输入mingw32-make,接着输入mingw32-make install。若无意外,SIP就安装完成了。

        常见问题:

        若是你的电脑上之前安装了Eclipse等其他软件,而将mingw32-make改成了make,那么就要将上面的mingw32-make命令改为make来使用。

        有个朋友说他按上面的方法使用make总是报错,仔细一问,才发现他的电脑上安装了Embacardero的RAD开发工具,也就是熟知的 Delphi和C++ Builder的开发工具。在安装了这个工具后,在命令行中输入make,使用的总是Embacardero的 C++ Builder的make。根据亲测,即使在配置的时候,使用python configure.py --platform win32-borland命令进行配置,对Emcarbadero的make也是无效的。这个配置命令产生的make文件,只是用于老版本的 Borland C++ Builder的make命令。

        若要使用微软的VC的nmake,就要在配置时使用命令python configure.py --platform win32-msvc,其中win32-msvc使用的是VC6的nmake;win32-msvc.net使用的是VC2003的 nmake;win32-msvc2005使用的是VC2005的nmake;win32-msvc2008使用的是VC2008的nmake。根据 --show-platforms命令显示的结果,SIP的配置暂不支持VC2010和VS11下的nmake。若想知道SIP支持的所有平台和编译器, 可以在命令行中使用python configure.py --show -platforms命令来查看。

        Linux:

        Linux下的SIP安装与之类似,甚至更简单,Linux的发行版如Ubuntu,都自动安装了python和gcc,无需配置环境变量。

        所以只要在官网上下载SIP的Linux下的tar.gz格式的代码包,解压到某个目录中。然后在终端中进入该目录,依次输入python configure.py --platform linux-g++;make;make install即可。

在Python中使用C/C++写的函数。

        1、首先,编写个C文件,功能是将两个数字相加并输出,命名为add.c,这个将成为在Python中的模块名,如下:


/* File : add.c */  
int add(int x, int y)   
{    
    int g;    
    g = x + y;  
    return g;  
}

        2、接着,手工编写SIP文件,在使用SIP的过程中,一个C/C++的源码文件,必须对应一个同名的sip文件,命名为add.sip,如下:

[plain] view plaincopy

  1. /* Define the SIP wrapper to the add library. */  

  2. %Module(name=add, language="C")  

  3. int add(int x, int y);       

        如果是源程序是用C++写的,那么这里的(name=add, language="C")就可以省去。
        这里的C源码文件没有头文件,所以对应的sip文件很简单。如果C/C++的源码是实现部分,在实现部分还包括接口部分,即头文件。那么在相应的sip文件中需要用

[cpp] view plaincopy

  1. %TypeHeaderCode  

  2. #include <word.h>  

  3. %End  

        来包含相应的头文件。sip文件与正式的C/C++头文件相似,但与之不同的是:sip文件不包含相应的头文件的私有成员变量(private或 protected)。更详细的sip文件编写规范,请参考riverbank官方网站上的说明文档SIP Reference Guide。

3、编译C文件。按照官网的说法,是编写configure.py,但别急,先做一些必不可少的工作。在命令行将add.c编译成add.o文件:输入

[sql] view plaincopy

  1. gcc -c add.c  

接着,将这一步生成的add.o文件生产库文件:

[plain] view plaincopy

  1. ar -r libadd.a add.o  

这两步在这里是为一个单独的C模块测试的,如果是大量的C模块,可以用一个makefile一并批量完成,这也是初学者容易模糊的地方。记住,需要将libadd.a文件复制到Python文件夹下的libs文件夹中。也可以将源代码直接编译成dll,命令为

        4、手工编写configure.py文件,同样,这个configure文件的编写也不难,看下规范就会了(要会鸟语。。。)。这里,我们模仿官网的模版写一个自己的configure.py。

[python] view plaincopy

  1. import os  

  2. import sipconfig  

  3.   

  4. # The name of the SIP build file generated by SIP and used by the build  

  5. # system.  

  6. build_file = "add.sbf"  

  7.   

  8. # Get the SIP configuration information.  

  9. config = sipconfig.Configuration()  

  10.   

  11. # Run SIP to generate the code.  

  12. os.system(" ".join([config.sip_bin, "-c", ".", "-b", build_file, "add.sip"]))  

  13.   

  14. # Create the Makefile.  

  15. makefile = sipconfig.SIPModuleMakefile(config, build_file)  

  16.   

  17. # Add the library we are wrapping.  The name doesn't include any platform  

  18. # specific prefixes or extensions (e.g. the "lib" prefix on UNIX, or the  

  19. # ".dll" extension on Windows).  

  20. makefile.extra_libs = ["add"]  

  21.   

  22. # Generate the Makefile itself.  

  23. makefile.generate()  

        5、运行configure.py,会生成一个makefile文件(直接用IDLE打开configure.py,按F5运行;或者命令行用python configure.py运行都可以)。
这里有个诡异的地方,有几个朋友在这一步会报错,说找不到add.sbf文件,而add.sbf文件应该是configure.py运行时调用相关函数自 动产生的。若出现这个问题,请重新编译SIP。如果是Windows下,最好是在另一台机器上拷贝一个完整的包含能正常的SIP的Python文件夹,到 有问题的机器上,将问题Python文件夹覆盖掉。

        6、在命令行输入make(这里会生成一个关于函数的警告,不用管它,我们是用来测试的。。。其他的应该没什么问题,若有问题请检查前面的步骤),生成add.pyd文件。然后再输入make install(将add.pyd文件装入到Python的Lib文件夹下的sit-packages文件夹中)。

        7、打开Python 的命令行,进行测试:

[python] view plaincopy

  1. >>>import add  

  2. >>>add.add(4, 7)  

  3. 11  

  4. >>>  

(原谅我这么烂的模块名。。。)

提示:

(1)、这些文件可以放到Python的文件夹下新建的文件夹中(所有的操作在这个目录下的命令行窗口中使用)。注意,Python的父文件夹名不能有空格,否则会无法读取库文件。

(2)、使用MinGW,需要把~\MinGW\bin添加的环境变量中(Linux下则不必),这样才能使用gcc、make和ar等工具。


本文转载自:http://blog.csdn.net/sunny2038/article/details/7237630

共有 人打赏支持
openthings
粉丝 248
博文 899
码字总数 468922
作品 1
东城
架构师
基于Python插件的C++扩展框架

这里介绍一种典型的C++应用框架,使用Python进行扩展。比如GIMP/Blender/QGIS等等Linux上面的开源软件,还有很多商业软件也采用了这一技术路线。但是由于Python的灵活性,可以使用C/C++直接扩...

openthings
2015/08/09
0
1
GIScript2015的第一个入门教程-使用UbuntuKylin15.04

GIScript2015是一个通用的GIS脚本库,可以帮助进行地理空间数据的处理和分析,提高数据处理的效率,帮助进行地理科学的研究。GIScript2015是一个开源工程,已建立Git版本库和虚拟Team、微信群...

openthings
2015/07/27
0
0
python的c语言扩展方法简介

原文地址:[http://www.isnowfy.com/introduction-to-python-c-extension/] python是一门非常方便的动态语言,很多你用c或者java要很多行的代码,可能python几行就搞定了,所以python社区一...

openthings
2015/01/21
0
2
使用SIP对C++类进行Python封装

本文来自于: http://pyqt.sourceforge.net/Docs/sip4/using.html#a-simple-c-example 本人翻译,欢迎转载,赠人玫瑰,手留余香。 Using SIP Bindings are generated by the SIP code generat......

openthings
2015/02/06
0
0
Windows下PyQt4的安装(转)

qt是c++库,在python中使用这个库就必须要有接口,使用python能够调用C++代码,qt官方选择了sip这个python与qt的接口库。 在pyqt的官网上,http://www.riverbankcomputing.co.uk/software/py...

out_lier
2014/01/17
0
0
Ubuntu 14.04下搭建Python3.4 + PyQt5.4.0 + Eric6.0开发平台

简要说明:QT是一个跨平台界面库和开发工具集,PyQt是其Python封装模块,其封装采用Sip完成(可以让C++库直接在Python中调用),Eric是基于Python的一个代码编辑器。 引言 找了很多Python GU...

openthings
2015/01/22
0
3
在UbuntuKylin15.04上安装GIScript2015

GIScript入门教程参见:http://my.oschina.net/u/2306127/blog/484213,这里介绍基于SIP的C++封装为Python的方法和使用过程。 GIScript2015版采用了新的SIP封装,从而可以更好地与C++接口保持...

openthings
2015/06/24
0
0
使用MetaSIP自动生成SIP封装C++到Python接口

利用SIP将C++封装为Python,SIP采用手动书写,但对于比较庞大的工程手动书写sip文件就显得很苍白无力。QT利用MetaSIP这款工具生成sip文件,然后手动修改部分SIP文件,然后利用python书写 co...

openthings
2015/06/24
0
1
Ubuntu 14.04下搭建Python3.4 + PyQt5.3.2 + Eric6.0开发平台

Ubuntu 14.04下搭建Python3.4 + PyQt5.3.2 + Eric6.0开发平台 分类: Linux Ubuntu Oracle 2014-10-14 14:49 3613人阅读 评论(13) 收藏 举报 UbuntuPythonSIPPyQt5Eric6 目录(?)[+] 引言 找了......

Sophia_tj
2015/02/28
0
0
PyQt在Windows XP上的编译

编译前, 须安装mingw, python, qt(要编译的话, 请参考这里).(转载补充说明:这里用到mingw的地方,都可以用vs2010或vs2008等的nmake命令取代。) 编译并安装sip 1. 下载并解压sip 2. 打开c...

kjpioo
2013/05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

微信小程序Java登录流程(ssm实现具体功能和加解密隐私信息问题解决方案)

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、登录流程图 二、小程序客户端 doLogin:function(callback = () =>{}){let ...

公众号_好好学java
17分钟前
0
0
流利阅读笔记28-20180717待学习

“我不干了!” 英国脱欧大臣递交辞呈 雪梨 2018-07-17 1.今日导读 7 月 6 日,英国政府高官齐聚英国首相的官方乡间别墅——契克斯庄园,讨论起草了一份关于英国政府脱欧立场的白皮书。可是没...

aibinxiao
46分钟前
4
0
OSChina 周二乱弹 —— 理解超算排名这个事,竟然超出了很多人的智商

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @-冰冰棒- :分享Ed Sheeran/Beyoncé的单曲《Perfect Duet (with Beyoncé)》 《Perfect Duet (with Beyoncé)》- Ed Sheeran/Beyoncé 手机...

小小编辑
57分钟前
40
5
Android 获取各大音乐平台的真实下载地址

废话 电脑使用谷歌浏览器或者QQ浏览器的时候。。。。。。。说不清楚,还是看图吧 大概意思就是,只要网页上需要播放,只要能播放并且开始播放,这个过程就肯定会请求到相关的音乐资源,然后就...

她叫我小渝
今天
0
0
shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
1
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部