zoukankan      html  css  js  c++  java
  • python 中用SWIG包装C和C++和接口生成的例子

    SWIG是简单包装和接口生成器的缩写,它是一个能用于用于集中语言的工具。一方面,可以通过它使用C语言或者C++编写扩展代码;另一方面,它会自动包装那些代码,以便能在一些高级语言中使用,例如Tcl Python Perl Ruby java. 这就意味着如果决定将系统的一部分使用C语言扩展编写,而不是直接在Python中实现的话,那么C语言扩展库也能在其他语言中使用。当然需要一些不同语言编写的子系统协同工作时,这一点就非常有用。C语言扩展在协同工作时会变得很重要。

     

    first step:

    一个简单的C语言程序:

    hello.c

    #include <stdio.h>

    #include <string.h>

    int say_hello(void)

    {

    printf("Hello world!!");

    return 0;

    }

     

    second step:

    编写接口文件: 接口描述放到文件hello.i中。在很多情况下,如果定义了头文件,SWIG就可以从头文件中得到需要的信息。因此如果拥有一个头文件,可以随意的使用它。显示的描写一个接口文件是因为可以知道SWIG是怎么包装代码的。最重要的是排除一些东西。比如,如果你要包装一个巨大的C语音库,可能需要导出一些function到Python中。在这种情况下,只要把需要导出的函数放到接口文件中就可以了。

    接口文件中,就像在一个头文件中那样,只需要声明要导出的函数和变量。头部的一个单元内,可以指定包含的头文件以及在这之前的一个%module声明,即为模块定义一个名字。

     

    hello.i

    %module hello

     

    %{

    #include<string.h>

    #include<stdio.h>

    %}

     

    extern int say_hello(void);

     

    third step:

    输入:swig -python hello.i

    得到两个新文件:hello_wrap.c 和hello.py

     

    forth step: 编译、链接以及使用

    编译可能是最有技巧的,为了正确的编译代码,需要知道python分布版的源代码放在哪。还要根据选择的C语言编译器,将代码链接到一个共享库,指明正确的选项。

    我用的是Ubuntu 10.10的系统

    eg.

    gcc -c hello.c

    gcc -I/usr/include/python2.6 -c hello_wrap.c  #根据python不同的版本自己选择文件夹

    gcc -shared hello.o hello_wrap.o -o _hello.so

     

    然后打开python

    >>> import _hello

    >>> dir(_hello)

    ['SWIG_PyInstanceMethod_New', '__doc__', '__file__', '__name__', '__package__', 'say_hello']

    >>>_hello.say_hello()

    Hello World!!0

     

    以上完毕。这个就是用SWIG来封装C语言。

  • 相关阅读:
    文件下载的几种方式
    获取文件的后缀名(转为数组) 字符串和变量的拼接 HTML中字符串和变量的拼接
    小程序之选择拍照或者本地相册
    实时显示时间
    uni-app事件冒泡 如何解决事件冒泡 推荐tap事件
    Codeforces Global Round 7 C. Permutation Partitions(组合数学)
    Codeforces Global Round 7 B. Maximums(逻辑)
    Codeforces Global Round 7 A. Bad Ugly Numbers(数学)
    Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version)(单调栈,递推)
    Codeforces Round #622 (Div. 2) B. Different Rules(数学)
  • 原文地址:https://www.cnblogs.com/nickchan/p/3104510.html
Copyright © 2011-2022 走看看