用 C/C++ 扩展 Python。

- 如果仅使用标准 C 库函数,则可以使用 Python 自带的 ctypes 模块,或者使用 cffi。

- 如果要使用自定义 C/C++ 函数,又不怕写 wrapper 麻烦,则可以使用 Python C API。

- 如果专门针对 C++ 模块打包,可以尝试使用 Boost。

除此之外,可以尝试一下 SWIG 打包 C/C++,以下是一个开始。

1) 自己编写接口文件 *.i

要打包的 C 代码 firstSwig.c

/* File: first swig, c file. */

double my_ver = 0.1;

// factorial
int fact(int n) {
if (n <= )
return ;
else
return n * fact(n-);
} // mod
int mod(int m, int n) {
return m % n;
}

定义接口文件 firstSwig.i

/* swig interface file */

%module firstSwig

%{
// Put headers and other declarations here
extern double my_ver;
extern int fact(int);
extern int mod(int, int);
%} extern double my_ver;
extern int fact(int);
extern int mod(int, int);

swig 命令生成 wrapper 文件 firstSwig_wrap.c 和 Python 模块文件 firstSwig.py

$ swig -python firstSwig.i

gcc 编译生成目标文件 firstSwig.ofirstSwig_wrap.o

$ gcc -c -fpic firstSwig.c firstSwig_wrap.c -I /usr/include/python2./

gcc 链接目标文件为动态链接库 _firstSwig.so

$ gcc -shared firstSwig.o firstSwig_wrap.o -o _firstSwig.so

然后将 firstSwig.py_firstSwig.so 一起发布即可。

2) 不编写接口文件 *.i,而是直接用头文件 *.h  (注意这种情况下,不支持变量的打包)

要打包的 C 代码 firstSwig.c

/* File: first swig, c file. */

// factorial
int fact(int n) {
if (n <= )
return ;
else
return n * fact(n-);
} // mod
int mod(int m, int n) {
return m % n;
}

对应 C 代码的头文件 firstSwig.h

/* File: first swig, header file. */

// factorial
int fact(int n); // mod
int mod(int m, int n);

swig 直接使用头文件生成 wrapper 文件 firstSwig_wrap.c 和 Python 模块文件 firstSwig.py

$ swig -python -module firstSwig firstSwig.h

其余步骤和方法 1) 一致,

gcc 编译生成目标文件 firstSwig.ofirstSwig_wrap.o

$ gcc -c -fpic firstSwig.c firstSwig_wrap.c -I /usr/include/python2./

gcc 链接目标文件为动态链接库 _firstSwig.so

$ gcc -shared firstSwig.o firstSwig_wrap.o -o _firstSwig.so

然后将 firstSwig.py_firstSwig.so 一起发布即可。

完。

SWIG 的应用(一)的更多相关文章

  1. Node.js-视图引擎【1】-Swig集成express的安装与配置

    node.js视图引擎,选来选去发现Swig最符合我的胃口哈哈. 一.安装Swig视图引擎 npm install -g swig 二.在node.js代码中配置如下 var app = requir ...

  2. express+gulp构建项目(五)swig模板

    这里的文件负责配置swig模板引擎. index.js var jsonHash = require('./json_file'); var staticTag = require("./t ...

  3. Python、Ruby中的SWIG使用案例

    案例一:Python通过SWIG使用C码 linux系统 照着文档[1]做就是了~! 案例二:Python程序调用张华平博士最新发布的中文分词库“NLPIR – ICTCLAS2013”为例~! wi ...

  4. 安装m2crypto报错swig error : Unrecognized option -builtin

    M2Crypto 是最完整的为 Python 包装 OpenSSL 的 RSA,DSA,DH,EC,HMACs,消息摘要,对称密码算法(包括AES)的一个库工具.而自从 M2Crypto 升级到版本 ...

  5. swig之于c++

    [namespace] namespace nsTest1 { int nsAdd(int a, int b) { return a + b; } } namespace nsTest2 { int ...

  6. crossplatform---Nodejs in Visual Studio Code 05.Swig+Bootstrap

    1. 开始 准备好Express+Swig的练习代码:https://github.com/Mengkzhaoyun/nodepractise 准备好AdminLTE后台管理模版:https://ww ...

  7. Swig 使用指南

    如何使用 API swig.init({ allowErrors: false, autoescape: true, cache: true, encoding: 'utf8', filters: { ...

  8. Demo Swig

    演示使用swig工具创建c语言的java接口,生成.so库和java接口文件. 在此之前先要安装swig,安装方法:sudo apt-get install swig 1.使用eclipse创建工程. ...

  9. html 模板 swig 预编译插件 grunt-swig-precompile

    GitHub grunt-swig-precompile NPM grunt-swig-precompile 在书写前端静态页面的时候,每个页面总在书写很多重复的标签. 为了提高效率,结合 swig. ...

  10. 在Python中调用C++,使用SWIG

    http://www.coder4.com/archives/2141 SWIG:Simplified Wrapper and Interface Generator,顾名思义,就是将C/C++包装为 ...

随机推荐

  1. 详解纯css实现瀑布流(multi-column多列及flex布局)

    瀑布流的布局自我感觉还是很吸引人的,最近又看到实现瀑布流这个做法,在这里记录下,特别的,感觉flex布局实现瀑布流还是有点懵的样子,不过现在就可以明白它的原理了 1.multi-column多列布局实 ...

  2. vue的data的数据进行指定赋值,用于筛选条件的清空,或者管理系统添加成功后给部分数据赋值为空

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 洛谷P5245 【模板】多项式快速幂(多项式ln 多项式exp)

    题意 题目链接 Sol \(B(x) = \exp(K\ln(A(x)))\) 做完了... 复杂度\(O(n\log n)\) // luogu-judger-enable-o2 // luogu- ...

  4. JS检测浏览器Adobe Reader插件

    Web应用中当我们希望向用户显示pdf文档时候,如果用户安装了Adobe Reader之类的pdf阅读器,就可以直接打开文档在浏览器中显示, 但是,当用户没有安装这类软件的时候,自然是打不开的,为了系 ...

  5. SuperMap iClient for JavaScript image出图

    SuperMap iClient for JavaScript 客户端基于openlayers 开发. 目前最高版本为811,9D产品后推荐客户使用leaflet.openlayers客户端开发. 问 ...

  6. Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果

    需求:  手机app ,当打游戏或者全屏看视频的时候会发现这时候手机顶部的状态栏是不显示的,当我们从手机顶端向下进行滑动或手机底端向上滑动的时候,状态栏会显示出来,如果短暂的几秒时间没有操作的话,状态 ...

  7. java集合继承关系图

    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的,数组中可以存储基 ...

  8. Mac 电脑如何安装mac os 和win7双系统(win7多分区)

    转载:Mac 电脑如何安装mac os 和win7双系统(win7多分区) 本文主要参考了2篇博文,并通过自己的亲身实践总结的.参考的2篇博文地址: http://wenku.baidu.com/li ...

  9. Scala链式编程内幕

    package big.data.analyse.scala /** * 链式编程原理 * Created by zhen on 2018/12/16. */ class Computer{def c ...

  10. CSS杂谈(1)图