利用SIP将C++封装为Python

SIP 是为Python生成C++接口代码的工具,它与 SWIG 类似,但使用不同的接口格式。其思想起源于SWIG,主要是为将QT封装为Python创造,它用作创建 PyQt和 PyKDE ,并支持
Qt signal/slot 系统。

本文主要介绍在Window平台下,SIP的编译、安装,以及将C++代码生成为Python。本文是在安装了Python的前提下介绍,Python的安装包,可以上其官网下载,这里不再累赘!

1.SIP编译及安装

在SIP官网http://www.riverbankcomputing.com/software/sip/download下载SIP,其最新版本是4.16.7,我下载的是最新版本。解压SIP,打开Windows的cmd命令行,进入SIP根目录,输入python
configure.py  --show-platform查看支持的平台。4.16.7支持的平台如下:

从上面截图可以看出,SIP目前还不支持VS2012,但打开SIP根目录下的specs查看所支持的平台时发现,可以通过修改其平台配置文件做到支持VS2012。

将win32-msvc2010复制一份,将复制一份名称修改为win32-msvc2012,用文本编辑器打开win32-msvc2012,修改一下内容:

将QMAKE_COMPILER_DEFINES  += _MSC_VER=1600 WIN32修改为QMAKE_COMPILER_DEFINES
 += _MSC_VER=1700 WIN32

将QMAKE_CFLAGS  = -nologo -Zm200 -Zc:wchar_t-修改为QMAKE_CFLAGS  = -nologo -Zm200 -Zc:wchar_t

回到SIP根,用文本编辑器打开configure.py将下面红色标注的内容替换为win32-msvc2012:

现在SIP支持VS2012了!

打开VS2012 开发人员命令提示,进入SIP根目录,依次执行以下命令:

python
configure.py  --platform win32-msvc2012

nmake

nmake install

第一条语句主要是生成Makefile文件

2.C++->Python

1)利用VS创建一个静态库的工程,主要实现字符串逆序,其内容如下:

.h文件

#ifndef PYSIPTEST_INCLUDE_H
#define PYSIPTEST_INCLUDE_H

#include <string>

using namespace std;

class Word
{
private:
	const string the_word;
public:
	Word(const char *w) : the_word(w) {};
	const char* Reverse() const;
};

#endif

CPP文件

#include <string>
#include <algorithm>
#include "PySIPTest.h"

const char* Word::Reverse() const
{
	string strTemp = the_word;
	std::reverse(strTemp.begin(), strTemp.end());

	return strTemp.c_str();
}

2)编写configure.py文件和*.sip文件

<span style="font-size:18px;">// word.sip

%Module word

class Word {

%TypeHeaderCode
#include <string>
#include <word.h>
%End

 public:
    Word(const char* w);
    const char* reverse() const;
};

# configure.py

import os, sipconfig, sys

# The name of the SIP build file generated by SIP and used by the build system.
build_file = "word.sbf"

# Get the SIP configuration information.
# Documentation: http://pyqt.sourceforge.net/Docs/sip4/build_system.html
config = sipconfig.Configuration()

# Run SIP to generate the code.
cmd = " ".join([config.sip_bin, "-c", ".", "-b", build_file, "word.sip"])
print( "running command " + cmd )
os.system(cmd)

# Create the Makefile.
makefile = sipconfig.SIPModuleMakefile(config, build_file)

# Add the library we are wrapping.
# The name doesn't include any platform specific prefixes or extensions.
makefile.extra_libs = ["word"]

# Generate the Makefile itself.
makefile.generate()</span>

运行configure.py,会生成一个makefile文件(直接用IDLE打开configure.py,按F5运行;或者命令行用python
configure.py运行都可以)

执行nmake命令生成,nmake install 安装。

这样C++就会封装为Python,如果没有设置目录,就会安装默认Python目录\Lib\site-packages下。

3.运行

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

Python 2.X系列测试代码如下:

<span style="font-size:18px;">import word
word.Word("SIPTest").reverse()</span>

Python 3.x系列测试代码如下:

<span style="font-size:18px;">import word
word.Word(b"SIPTest").reverse()</span>

SIP很是强大,本文只是肤浅的介绍了SIP的一点东西,欢迎大家指正。

同时欢迎大家转载,转载请注明出处!

时间: 2024-10-12 23:23:29

利用SIP将C++封装为Python的相关文章

利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)

最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口: 1.public Connection getConnection()   获得数据库的连接 2.public boolean updateByPreparedStatement(String sql, List<Object>params)throws SQLException  更新数据库

【原创】Capture CIS利用Access数据库建立封装库说明

1.在服务器端建立新空间,方便封装库以及数据库的归档存放 服务器路径:\\192.168.1.234\Share\STG_LIB,文件夹内容如下,其中Datesheet存放物料数据手册,Pcb_Lib存放Allegro封装,Schematic_Lib存放Capture封装,STG_Datebase存放数据库文件. 2.构建Access数据库 1)打开Access软件,执行新建命令,弹出如下窗口.在右下角选择存放路径并设置文件名称,点击创建.(2007以上版本文件后缀为"accdb",2

使用SIP对C++类进行Python封装

Python中使用C/C++模块有许多工具,大名鼎鼎的有SWIG(英文意思为:豪饮).SIP(英文意思为:啜饮,小口的喝),还有 boost.python等.其中SIP是从SWIG发展而来,专为Python调用C/C++模块使用的(看SIP的命名就能看出来,很有意思的). SIP的使用方法,在官网的SIP Reference Guide中有介绍,不过那是针对至少有点经验的人员,对初学者来说,想十分钟快速上手还是有点难度的.这里就介绍下本人在使用SIP总结的需要注意的地 方.(本着方便大家方便自己

LightMysql:为方便操作MySQL而封装的Python类

原文链接:http://www.danfengcao.info/python/2015/12/26/lightweight-python-mysql-class.html mysqldb是Python操作MySQL数据库的一个常用包.但在使用过程中,我认为用起来还不够简便.为此,我在mysqldb的基础上封装了一个Python类LightMysql. 先来看如何使用 example.py #!/usr/bin/env python # -*- coding: utf-8 -*- from Lig

自己封装的python——DBUtilS,大家多多指教

这个Utils用了第三方库DBUtils,我经过又一层了简单封装,自认为还是挺简洁的,只实现了增删改查 import MySQLdb,functools from DBUtils.PooledDB import PooledDB import sys reload(sys) sys.setdefaultencoding('utf-8') sys.path.append('../') import readConfig __author__='xiezhaodong at 2014-8-14' c

python/c++接口库比较(SWIG,boost.python, pycxx, py++, sip, Weave, Pyrex )

<python/c++接口库比较(SWIG,boost.python, pycxx, py++, sip, Weave, Pyrex )>http://blog.csdn.net/lainegates/article/details/19565823 目前有很多开源的Python/c++ 绑定工具,搜了好多岾子,这里稍微总结下. SWIG 支持 Python 2 and 3 配置正确的话,可以全自动完成封装(*.i文件需要自己写) 当不是全自动的时候,它大多会重复你的.h文件并给出提示 除了P

python多线程为什么不能利用多核cpu

GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题.运行下面这段 python 程序,CPU 占用率是多少? # 请勿在工作中模仿,危险:) def dead_loop(): while True: pass dead_loop() 答案是什么呢,占用 100% CPU?那是单核!还得是没有超线程的古董 CPU.在我的双核 CPU 上,这个死循环只会吃掉我一个核的工作负荷,也就是只占用 50% CPU.那如何能让它在双核

Python 2.7_利用xpath语法爬取豆瓣图书top250信息_20170129

大年初二,忙完家里一些事,顺带有人交流爬取豆瓣图书top250 1.构造urls列表 urls=['https://book.douban.com/top250?start={}'.format(str(i) for i in range(0, 226, 25))] 2.模块 requests获取网页源代码 lxml 解析网页 xpath提取 3.提取信息 4.可以封装成函数 此处没有封装调用 python代码: #coding:utf-8 import sys reload(sys) sys.

python多核心利用测试

对于很多企业来说,随着时间的推移,用户量或者企业建点扩张,使用erp就会出现应用访问越来越慢的情况,其实这种情况不但限于erp,只要是有数据量增长的互联网业务必然会遇到的,因为一开始的是就没有做好大数据量的访问情况. odoo erp是python开发的,python相对c.c++.java等在性能方面确实是低了很多,归根到底就是本来python就是c跟c++开发出来的语言,另外python让人诟病的全局解释器锁(GIL,Global Interpreter Lock),想要更加了解GIL的话可