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 < 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
>>>

可以吧动态模块直接生成当前目录下

1
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

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 编译

1
python setup.py build_ext --inplace

 





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/4464117.html,如需转载请自行联系原作者


相关文章
|
27天前
|
Linux Shell Python
Linux执行Python脚本
Linux执行Python脚本
27 1
|
17天前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
|
1月前
|
编译器 测试技术 C++
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
165 0
|
5天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
25 6
|
16天前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
【4月更文挑战第9天】本文探讨了Python在自动化测试中的应用,强调其作为热门选择的原因。Python拥有丰富的测试框架(如unittest、pytest、nose)以支持自动化测试,简化测试用例的编写与维护。示例展示了使用unittest进行单元测试的基本步骤。此外,Python还适用于集成测试、系统测试等,提供模拟外部系统行为的工具。在脚本编写实践中,Python的灵活语法和强大库(如os、shutil、sqlite3、json)助力执行复杂测试任务。同时,Python支持并发、分布式执行及与Jenkins、Travis CI等持续集成工具的集成,提升测试效率和质量。
|
23天前
|
C++ Python
【C++/Python】C++调用python文件
【C++/Python】C++调用python文件
|
23天前
|
存储 监控 异构计算
【Python】GPU内存监控脚本
【Python】GPU内存监控脚本
|
23天前
|
Ubuntu Unix Linux
【Linux/Ubuntu】Linux/Ubuntu运行python脚本
【Linux/Ubuntu】Linux/Ubuntu运行python脚本
|
1月前
|
算法 编译器 C++
【C++ 关键字的混合使用 】C++深度探索:auto、static、constexpr的交互影响与应用
【C++ 关键字的混合使用 】C++深度探索:auto、static、constexpr的交互影响与应用
31 0
|
1月前
|
XML Shell Linux
性能工具之 JMeter 使用 Python 脚本快速执行
性能工具之 JMeter 使用 Python 脚本快速执行
41 1
性能工具之 JMeter 使用 Python 脚本快速执行