SWIG 和 Python——c/c++与脚本交互
C 和 C++ 被公认为(理当如此)创建高性能代码的首选平台。对开发人员的一个常见要求是向脚本语言接口公开 C/C++ 代码,这正是 Simplified Wrapper and Interface Generator (SWIG) 的用武之地。SWIG 允许您向广泛的脚本语言公开 C/C++ 代码,包括 Ruby、Perl、Tcl 和 Python等。
为了建立python的扩展模块,SWIG采用分层的策略:用c写扩充模块,其余部分用python写。c包含低层次的封装,而python包含高层次的封装。分层策略是扩展模块的特定部分用特定的语言完成(而不全部用c/c++完成),另外通过利用2种语言,可以发挥各自语言的特性,增加灵活性。
1. 安装(Windows)
下载:http://www.swig.org/download.html
解压把swig.exe的地址写入到环境变量的环境变量的Path变量中。
2. 例子(c语言)
#2.1 用c语言编写头文件和源文件为
/* File: example.h */ int fact(int n);
/* File: example.c */
#include "example.h"
int fact(int n) {
if (n < ){ /* This should probably return an error, but this is simpler */
return ;
}
if (n == ) {
return ;
}
else {
/* testing for overflow would be a good idea here */
return n * fact(n-);
}
}
#2.2 写swig模块写一个文件
/* File: example.i */
%module example %{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%} int fact(int n);
#2.3 为了建python模块,利用-python参数执行swig
swig -python example.i
执行完命令后生成两个不同的文件:example_wrap.c和example.py。
自动生成文件名的原则:生成的c文件名与写的c文件名有关(例如写的c文件名为example.c则生成example_wrap.c);生成的python文件即.i文件中%module后面的名字。
#2.4 利用distutils生成动态库
python自带一个distutils工具,可以用它来创建python的扩展模块。使用它也很简单,只需要先定义一个配置文件,通常是命名为setup.py
"""
setup.py
""" from distutils.core import setup, Extension example_module = Extension('_example',
sources=['example_wrap.c', 'example.c'],
) setup (name = 'example',
version = '0.1',
author = "SWIG Docs",
description = """Simple swig example from docs""",
ext_modules = [example_module],
py_modules = ["example"],
)
注:头文件和源文件都是example.*,那么setup.py脚本中Extension的参数必须为“_example”
#2.5 编译
python setup.py build
会在本目录下build/lib*/下生成_example.pyd模块,可以直接使用,例如
>>>import example
>>>print example.fact(4)
24
>>>
可以吧动态模块直接生成当前目录下
python setup.py build_ext --inplace
3. 例子(c++)
和c一样,稍微区别
#3.1 用c语言编写头文件和源文件为
/* File: example.h */ int fact(int n);
/* File: example.cpp */
#include "example.h"
int fact(int n) {
if (n < 0){ /* This should probably return an error, but this is simpler */
return 0;
}
if (n == 0) {
return 1;
}
else {
/* testing for overflow would be a good idea here */
return n * fact(n-1);
}
}
#3.2 写swig模块写一个文件
/* File: example.i */
%module example %{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%} int fact(int n);
#3.3 为了建python模块,利用-python参数执行swig
swig -c++ -python example.i
执行完命令后生成两个不同的文件:example_wrap.cxx和example.py。
#3.4 利用distutils生成动态库
python自带一个distutils工具,可以用它来创建python的扩展模块。使用它也很简单,只需要先定义一个配置文件,通常是命名为setup.py
"""
setup.py
""" from distutils.core import setup, Extension example_module = Extension('_example',
sources=['example_wrap.cxx', 'example.cpp'],
) setup (name = 'example',
version = '0.1',
author = "SWIG Docs",
description = """Simple swig example from docs""",
ext_modules = [example_module],
py_modules = ["example"],
)
注:头文件和源文件都是example.*,那么setup.py脚本中Extension的参数必须为“_example”
#3.5 编译
python setup.py build_ext --inplace
SWIG 和 Python——c/c++与脚本交互的更多相关文章
- python 暴力破解密码脚本
python 暴力破解密码脚本 以下,仅为个人测试代码,环境也是测试环境,暴力破解原理都是一样的, 假设要暴力破解登陆网站www.a.com 用户 testUser的密码, 首先,该网站登陆的验证要支 ...
- Unity NGUI 网络斗地主 -发牌 脚本交互
Unity NGUI 网络斗地主 -发牌 脚本交互 @By 灰太龙 Unity4.2.1f4 NGUI 3.0.4 本篇说的问题是脚本与控件的交互! 现在对界面进行了改进,先看副图! 1.制作发牌效果 ...
- 一个好用的Python备份mysql的脚本
前几天打算用Python写一个mysql脚本,上Google看了下老外写的,写的挺好的,原地址在http://tecadmin.net/python-script-for-mysql-database ...
- 用Python写的简单脚本更新本地hosts
这两天Google墙得严重,于是就产生了做个一键更新hosts的脚本的想法. 由于正在学习Python,理所当然用Python来写这个脚本了. 接触比较多的就是urllib2这个库,习惯性的impor ...
- 现在都是python 单独开发框架 执行脚本,处理结果,发报告之类的
现在都是python 单独开发框架 执行脚本,处理结果,发报告之类的
- shell脚本交互:expect学习笔记及实例详解
最近项目需求,需要写一些shell脚本交互,管道不够用时,expect可以很好的实现脚本之间交互,搜索资料,发现网上好多文章都是转载的,觉得这篇文章还不错,所以简单修改之后拿过来和大家分享一下~ 1. ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
- Python 网站后台扫描脚本
Python 网站后台扫描脚本 #!/usr/bin/python #coding=utf-8 import sys import urllib import time url = "ht ...
- python简单的监控脚本-利用socket、psutil阻止远程主机运行特定程序
python简单的监控脚本-利用socket.psutil阻止远程主机运行特定程序 psutil是一个跨平台的库(http://code.google.com/p/psutil/),能够轻松的实现获取 ...
随机推荐
- MODI中的OCR模块
作者:马健邮箱:stronghorse_mj@hotmail.com发布:2012.07.02更新:2012.07.09补充非简体中文版内容 自从基于MODI的DjVuToy.FreePic2Pdf. ...
- MVC Controller传值到View的几种方式总结
Controller中的代码如下 var bingo = new Web1.Models.Bingo() { Title = "测试", desc = "嘻嘻" ...
- UIPasteboard
1.UIPasteboard 简介 顾名思义,UIPasteboard 是剪切板功能,因为 iOS 的原生控件 UITextField.UITextView.UIWebView, 我们在使用时如果长按 ...
- Bash Shell 小试牛刀
一.终端打印 [root@cai ~]# echo welcome to bash! welcome to bash! [cairui@cai ~]$ echo 'welcome to bash!' ...
- oracle数据结构
数据类型: 1 字符数据:CHAR VARCHAR NCHAR NVARCHAR2 LONG CLOB NCLOB 2 数字数据类型:NUMBER 唯一用来存储数字型的类型 3 日期数据类型: 4 ...
- P3379 【模板】最近公共祖先(LCA)(LCT)
\(\color{#0066ff}{ 题目描述 }\) 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. \(\color{#0066ff}{输入格式}\) 第一行包含三个正整数N.M. ...
- 重装iTunes 错误代码42401 解决办法
昨晚手贱点击从iTunes 11升级到iTunes12,之后发现iTunes 12各种卡,简直不能忍,然后直接拉iTunes 12到AppClear,然后安装iTunes 11,安装完成之后打开iTu ...
- CentOS7l联网
原文:https://blog.csdn.net/nothing2017/article/details/61420767 步骤: 1.以root管理员身份登录系统,输入 --->(ls / ...
- 解决maven项目中有小红叉的问题
首先在window--perferences--showview中显示problems中查看出错的原因
- webpack4.0入门配置文件
wepback风头正火 ,但是公司一直在用gulp,正好赶上年底活动,借此机会第一次尝试了webpack,说实话webpack真的很强大,内容一层一层递进. 这几天跟着官网跑了一遍,然后写了自己的配置 ...