在Python中调用C++,使用SWIG
http://www.coder4.com/archives/2141
SWIG:Simplified Wrapper and Interface Generator,顾名思义,就是将C/C++包装为其他高级语言的Wrapper工具,非常好用。
该项目历史悠久(创始于1995年!),且一直非常活跃,目前最新版本为2011年5月发布的2.0.4。
1、安装SWIG
1
2
3
4
5
6
7
|
wget http://prdownloads.sourceforge.net/swig/swig-2.0.4.tar.gz
tar -xzvf swig-2.0.4.tar.gz
cd swig-2.0.4/
#我们这里只编译Python的语言支持,可以根据你得需要加别的!
./configure --without-alllang --with-python|grep python
make
sudo make install
|
2、C++代码
我们以包装一个简单的类为例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <string>
using std::string;
class MyObj
{
public:
string SayHello(string name)
{
string ret("Hello, ");
return ret + name;
}
private:
string id;
};
|
3、编写Interface文件
SWIG需要一个intf文件,可以写的很复杂,也可以偷懒:只引用你要Wrap的.h头问件就可以啦!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/* myobj.i */
%module myobj
%{
/* 相关引用 */
#include "MyObj.h"
#include <string>
%}
/* 对STL的支持 */
%include stl.i
/* Wrapper并生成代码 */
%include "MyObj.h"
|
4、生成Wrapper代码
1
2
3
4
5
6
7
8
|
#生成,第一个python是目标语言,跌入个-c++是启用c++模式
swig -python -c++ ./myobj.i
#成功的话,会生成如下文件
myobj.i myobj_wrap.c myobj_wrap.cxx
#编译,生成so文件,注意一定要用g++而不是ld做Link!!
g++ -c myobj_wrap.c myobj_wrap.cxx -I /usr/include/python2.6/ -fPIC
g++ -shared myobj_wrap.o -o _myobj.so
|
5、测试
1
2
3
4
5
|
>>> import myobj
>>> o = myobj.MyObj()
>>> o.SayHello("ICT")
'Hello, ICT'
>>>
|
6、补充
如果你想使用复合类型,例如vector<string>,请务必在.i文件中声明!
1
2
3
4
|
namespace std{
%template(VectorOfString) vector<string>;
}
|
在Python中调用C++,使用SWIG的更多相关文章
- 如何在python中调用C语言代码
1.使用C扩展CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在自己的Python代码中来调用C编写的函数-ctypes,SWIG,Python/ ...
- Python脚本传參和Python中调用mysqldump
Python脚本传參和Python中调用mysqldump<pre name="code" class="python">#coding=utf-8 ...
- Django之在Python中调用Django环境
Django之在Python中调用Django环境 新建一个py文件,在其中写下如下代码: import os if __name__ == '__main__': os.environ.setdef ...
- (转)python中调用R语言通过rpy2 进行交互安装配置详解
python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753 python中调用R语言通过r ...
- Python中调用自然语言处理工具HanLP手记
手记实用系列文章: 1 结巴分词和自然语言处理HanLP处理手记 2 Python中文语料批量预处理手记 3 自然语言处理手记 4 Python中调用自然语言处理工具HanLP手记 5 Python中 ...
- 使用ctypes在Python中调用C++动态库
使用ctypes在Python中调用C++动态库 入门操作 使用ctypes库可以直接调用C语言编写的动态库,而如果是调用C++编写的动态库,需要使用extern关键字对动态库的函数进行声明: #in ...
- [Python-MATLAB] 在Python中调用MATLAB的API
可以参考官方的说明文档: http://cn.mathworks.com/help/matlab/matlab_external/get-started-with-matlab-engine-for- ...
- 在python中调用js或者nodejs
在python中调用js或者nodejs要使用PyExecJs第三方包. pip install pyexecjs 示例代码 >>> import execjs >>&g ...
- PySpark 的背后原理--在Driver端,通过Py4j实现在Python中调用Java的方法.pyspark.executor 端一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。
PySpark 的背后原理 Spark主要是由Scala语言开发,为了方便和其他系统集成而不引入scala相关依赖,部分实现使用Java语言开发,例如External Shuffle Service等 ...
- 4.1 python中调用rust程序
概述 使用rust-cpython将rust程序做为python模块调用: 通常为了提高python的性能: 参考 https://github.com/dgrunwald/rust-cpython ...
随机推荐
- PHP之curl
当我第一次接触curl的时候,看文档,以及网上search各种资料,官方(http://cn2.php.net/manual/en/intro.curl.php)的解释是,这是某大牛写的一个libcu ...
- IIS经典模式和集成模式在管道模型中的不同
问题: 有时候我们配置IIS后可能运行提示以下错误: HTTP 错误 500.23 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 其中由 ...
- 利用CodeSmith生成抽象工厂步骤
其实CodeSmith挺好的,帮我们主动生成不少代码,并且代码质量不错,下面就来介绍一下利用CodeSmith生成抽象工厂步骤 打开codesmith模板的buildall 注意path的设置,因为后 ...
- Webbrowers控件的小技巧
我最近接触webbrowers 这个控件比较多,感觉用起来比较顺手吧.可以做很多操作. 貌似很多网络模拟有时候都内置这个控件或者类似的控件,但这样子速度就不能跟那些单纯用API 构建数据包比了. 我一 ...
- 12天学好C语言——记录我的C语言学习之路(Day 12)
12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...
- 解决div布局中第一个div的margin-top在浏览器中显示无效果问题。
原味来源:http://www.hicss.net/do-not-tell-me-you-understand-margin/ 垂直外边距合并问题 别被上面这个名词给吓倒了,简单地说,外边距合并指的是 ...
- 05顺序队列_Queue--(栈与队列)
#include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...
- C++实用数据结构:二叉索引树
看下面这个问题(动态连续和查询): 有一个数组A(长度为n),要求进行两种操作: add(i,x):让Ai增大x: query(a,b):询问Aa+Aa+1+...+Ab的和: 若进行模拟,则每次qu ...
- Python爬虫第一集
import urllib2 response = urllib2.urlopen("http://www.baidu.com") print response.read() 简单 ...
- 在Windows下用MingW 4.5.2编译live555
1.下载live555(http://www.live555.com/liveMedia/public/),解压. 2.进入MingW Shell,输入cd: F:/Qt/live(假定解压到F:/Q ...