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

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

"""
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 編譯

python setup.py build

會在本目錄下build/lib*/下生成_example.pyd模塊,可以直接使用,例如

>>>import example
>>>print example.fact(4)
24
>>>

可以吧動態模塊直接生成當前目錄下

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

swig -c++ -python example.i

執行完命令后生成兩個不同的文件:example_wrap.cxx和example.py。

 

#3.4 利用distutils生成動態庫

python自帶一個distutils工具,可以用它來創建python的擴展模塊。使用它也很簡單,只需要先定義一個配置文件,通常是命名為setup.py

"""
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 編譯

python setup.py build_ext --inplace

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM