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