SWIG 和 Python——c/c++与脚本交互

本文介绍如何使用SWIG工具将C/C++代码暴露给Python,包括安装SWIG、编写C/C++源文件、SWIG接口文件,以及利用distutils构建Python扩展模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转至:http://www.cnblogs.com/kaituorensheng/p/4464117.html


### 回答1: PowerDesigner工具箱位置在工具栏的最左侧,可以通过点击工具栏上的“工具箱”按钮来打开。如果工具箱不在工具栏上,可以通过菜单栏中的“视图”选项来打开。在打开工具箱中,可以找到各种建模元素和工具,如类、实体、关系、属性等。 ### 回答2: 在 PowerDesigner 中,工具箱toolbox)是很重要的一个窗口,它包含了工具、模型元素、图形等等一些可用的组件。它可以帮助设计师轻松地选择和引入所需的元素。在 PowerDesigner 工具箱中,不仅包含了常见的 UML 元素,还包含了许多其他类型的元素,比如关系数据库中的表、视图、存储过程等等。如果您不知道如何找到 PowerDesigner 工具箱的位置,这里提供了几种方法。 首先,如果您是第一次使用 PowerDesigner 或者之前没有使用过工具箱,那么您需要从菜单栏中打开它。在 PowerDesigner 的菜单栏中,选择 “视图” -> “工具箱” ,即可打开工具箱窗口。如果您需要使用工具箱的快捷键,可以使用 “Ctrl + T” 快捷键打开它。 其次,您还可以找到 PowerDesigner 工具箱的选项卡,这个选项卡与所有其他选项卡一样,位于工作区下方。如果您看不到它,可以尝试调整工作区的大小或移动其他选项卡,尝试找到它。 另外,在工具箱窗口中,您可以选择要显示的元素类型。在默认情况下,只显示 UML 元素,但您可以使用 “显示” 下拉菜单选择其他类型的元素,也可以使用搜索框查找特定元素。 最后,您还可以通过自定义 PowerDesigner 工具箱的位置来实现常用元素的快速查找。在 PowerDesigner 工具箱窗口的右上角,您可以找到一个小箭头图标,单击它将展开菜单,其中包含 “自定义” 选项。单击它后,您可以选择移动工具箱窗口的位置、调整宽度和高度等等。您还可以选择将工具箱窗口固定在屏幕上,使其始终在最前面或者在其他窗口上方。 总之,PowerDesigner 工具箱是非常重要的一个窗口,它可以帮助设计师轻松引入所需元素,从而提高工作效率。如果您对 PowerDesigner 工具箱的位置不确定,可以根据上述步骤进行查找和定位。 ### 回答3: PowerDesigner工具箱Toolbox)是用户可以使用的一组预定义图形和符号集,用户可以从其中选择图形和符号来创建自己的数据模型、流程图、业务流程等。 PowerDesigner提供了很多工具箱,例如数据建模、流程建模、业务流程建模等。这些工具箱位于PowerDesigner应用程序界面的左侧,如果没有显示,可以通过“视图”菜单中的“工具箱”选项进行打开工具箱中的图形和符号是预定义的,用户也可以通过自定义工具箱来添加自己的图形和符号。例如,在数据建模工具箱中,可以通过右键单击工具箱区域来打开工具箱类型”菜单,选择“新工具箱类型”,然后进行图形和符号的自定义配置。 另外,工具箱中的图形和符号都具有不同的含义和用途,用户在选择和使用时需要注意。例如,在数据建模工具箱中,实体、属性以及关系等图形是最常用的,而在流程建模工具箱中,任务、网关以及流程线等图形被广泛应用。 综上,PowerDesigner工具箱位于应用程序界面的左侧,提供了预定义的图形和符号集,为用户创建数据模型、流程图、业务流程等提供便利。同时,用户也可以通过自定义工具箱来添加自己的图形和符号。在选择和使用工具箱中的图形和符号时,需要根据具体的需求和用途进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值