swig 把c/c++ 封装成python可调用的so文动态链接库

16 篇文章 0 订阅

注意:使用此种方法产生的so文件放在 python的site 目录下,可以直接import example,调用模块。

我们经常会看到python一些项目源码中,有的方法直接pass

[html]  view plain  copy
  1. def has_key(self, k): # real signature unknown; restored from __doc__  
  2.        """ D.has_key(k) -> True if D has a key k, else False """  
  3.        return False  
  4.   
  5.    def items(self): # real signature unknown; restored from __doc__  
  6.        """ D.items() -> list of D's (key, value) pairs, as 2-tuples """  
  7.        return []  
  8.   
  9.    def iteritems(self): # real signature unknown; restored from __doc__  
  10.        """ D.iteritems() -> an iterator over the (key, value) items of D """  
  11.        pass  


但是,他们确实执行了,什么原因呢,就是使用了swig制作的so文件。


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. 安装SWIG(ubuntu)

1. 下载 swig 源码


http://www.swig.org/survey.html

填写一个简单的问卷,即可进入 sourceforge 下载。


2. 安装 g++


[html]  view plain  copy
  1. sudo apt-get install g++  


如果安装过,无需再次安装。步骤 3 同理。

检验一下你的系统是否安装了 g++,输入

[html]  view plain  copy
  1. g++ -version  



3. 安装 pcre


[html]  view plain  copy
  1. sudo apt-get install libpcre3 libpcre3-dev  



4. 解压 swig 源码 


[html]  view plain  copy
  1. chmod 777 swig-2.0.11.tar.gz // 改变权限  
  2. tar -xzvf swig-2.0.11.tar.gz // 解压  



5. 配置、编译和安装 swig


cd 到刚才解压的目录里面

[html]  view plain  copy
  1. ./configure --prefix=/usr/local/share/swig3.0.12 // 指定安装目录  
  2. make // 编译  
  3. make install // 安装  


如果想让默认安装的话,可以直接执行./configure


6. 配置 path


[html]  view plain  copy
  1. sudo vim /etc/profile  


把swig的安装bin路径添加到环境变量中

[html]  view plain  copy
  1. PATH=/usr/local/share/swig3.0.12/bin:$PATH  


这样,在其他路径下就可以执行 swig 命令。


7.查看版本信息




安装成功!

 

2. 例子(c语言)

附上整好的目录,本人做的时候

[html]  view plain  copy
  1. .  
  2. ├── build  
  3. │   ├── lib.linux-x86_64-2.7  
  4. │   │   └── _example.so  
  5. │   └── temp.linux-x86_64-2.7  
  6. │       ├── example.o  
  7. │       └── example_wrap.o  
  8. ├── example.c  
  9. ├── example.h  
  10. ├── example.i  
  11. ├── example.py  
  12. ├── example.pyc  
  13. ├── _example.so  
  14. ├── example_wrap.c  
  15. └── setup.py  


2. 例子(c语言)

#2.1 用c语言编写头文件和源文件为

/* File: example.h */

int fact(int n);

 

/* File: example.c */

#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);
    }
}

 

#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

1
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"" "
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 编译

1
python setup.py build

会在本目录下build/lib*/下生成_example.pyd模块,可以直接使用,例如

1
2
3
4
>>>import example
>>> print  example.fact( 4 )
24
>>>

可以以使用下面命令生成so动态库,下面命令会生成example.so

1
python setup.py build_ext --inplace

把example.so 放在 python的site 目录下,如/usr/local/lib/python2.7/dist-packages目录下,import example会自动加载

[html]  view plain  copy
  1. import example  
  2. print example.fact(4)  


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

1
swig -c++ -python example.i

执行完命令后生成两个不同的文件:example_wrap.cxx和example.py。

 

#3.4 利用distutils生成动态库

python自带一个distutils工具,可以用它来创建python的扩展模块。使用它也很简单,只需要先定义一个配置文件,通常是命名为setup.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"" "
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 编译,会生成example.so,

1
python setup.py build_ext --inplace

把example.so 放在 python的site 目录下,如/usr/local/lib/python2.7/dist-packages目录下,import example会自动加载

[html]  view plain  copy
  1. import example  
  2. print example.fact(4)  


如果使用 pycharm等IDE工具查看源码,您会看到如下
[html]  view plain  copy
  1. # encoding: utf-8  
  2. # module _example  
  3. # from /usr/local/lib/python2.7/dist-packages/_example.so  
  4. # by generator 1.138  
  5. # no doc  
  6. # no imports  
  7.   
  8. # functions  
  9.   
  10. def fact(*args, **kwargs): # real signature unknown  
  11.     pass  
  12.   
  13. def SWIG_PyInstanceMethod_New(*args, **kwargs): # real signature unknown  
  14.     pass  
  15.   
  16. # no classes  
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值