SWIGとPython-c/c++はスクリプトとインタラクティブ

6784 ワード

CおよびC++は、高性能コードを作成するための第一選択プラットフォームとして公認されている.開発者にとって一般的な要求は、スクリプト言語インタフェースにC/C++コードを公開することであり、これはSimplified Wrapper and Interface Generator(SWIG)の使用地である.SWIGでは、Ruby、Perl、Tcl、Pythonなど、幅広いスクリプト言語にC/C++コードを公開できます.
pythonの拡張モジュールを構築するために、SWIGは階層化されたポリシーを採用しています.cで拡張モジュールを書き、残りの部分はpythonで書きます.cは低階層のパッケージを含み、pythonは高階層のパッケージを含む.階層化戦略は,拡張モジュールの特定の部分を特定の言語で(すべてc/c++ではなく)完成させ,また2つの言語を利用することで,それぞれの言語の特性を発揮し,柔軟性を高めることができる.
 
1.インストール(Windows)
ダウンロード:http://www.swig.org/download.html
解凍ハンドル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

コマンドを実行した後、2つの異なるファイルを生成します: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.*です.じゃあ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

コマンドを実行した後、2つの異なるファイルを生成します: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.*です.じゃあpyスクリプトのExtensionのパラメータは「_example」でなければなりません.
 
#3.5コンパイル
python setup.py build_ext --inplace