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

  • 相关阅读:
    Java泛型T与?
    json解析出现:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX
    Html 项目使用自定义字体文件问题
    修复 WordPress 通过邮箱 找回密码时的链接无效&新用户注册时提示的链接无效
    Linux查询进程和结束进程
    Linux --- 程序后台运行的几种方法
    bash_profile和bashsrc的区别
    在CentOS中安装与配置Server JRE 8
    JRE和JDK的区别
    java中静态代码块详解
  • 原文地址:https://www.cnblogs.com/nickchan/p/3104510.html
Copyright © 2020-2023  润新知