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/),能够轻松的实现获取 ...
随机推荐
- 开启VS的JavaScript调试
前提条件,设置我们的IE 去掉勾,即启用调试然后再JS代码片段中输入debugger.注意:如果IE开启了F12调试面板, VS是不会捕获JS代码片段中的debugger断点.
- silverlight browse information
public class Browser { /// <summary> /// During static instantiation, only the Netscape flag i ...
- 高仿JDK动态代理 底层源码实现
动态代理实现思路 实现功能:通过Proxy.newProxyInstance返回代理对象 1.创建一个处理业务逻辑的接口,我们也和JDK一样,都使用InvocationHandler作为接口名,然后接 ...
- docker搭建数据库主从复制
首先需要安装docker镜像: docker pull mysql:5.7 由于需要启动数据库才可以进入数据修改my.cnf文件,可以选择安装vi命令,也可以选择挂在 在此选择是挂载的方法进行安装: ...
- java Swing包相关知识点
1.窗体的创建及相关的常用设置 //创建一个窗体 JFrame jf=new JFrame("第一步句法分析"); //设置用户在此窗体上发起 "close" ...
- vscode 注册表
Windows Registry Editor Version 5.00 ; Open files [HKEY_CLASSES_ROOT\*\shell\Open with VS Code] @=&q ...
- eclipse gradle 找不到依赖解决办法
右击工程,选择gradle 在点击Refresh Gradle Project 即可,..不得不说,gradle 在eclipse 下真没maven 好用.....
- ul li做横向导航栏例子
/* ul li以横排显示 */ /* 所有class为menu的div中的ul样式 */ div.menu ul { list-style:none; /* 去掉ul前面的符号 */ margin: ...
- 网络流之最大流与最小费用流入门&&模板
理解处 刷题处 模板处 最大流模板 处理重边的+(优化) #include<bits/stdc++.h> using namespace std; ; const int INF = 0x ...
- 免费的mysql数据库
https://blog.csdn.net/kernel_/article/details/53320498