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语言。

  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/nickchan/p/3104510.html
Copyright © 2011-2022 走看看