C/C ++ライブラリとのインタフェース¶
C外部関数インタフェース¶
CFFI は、CPythonとPyPyの両方からCとインタフェースするための使いやすいメカニズムを提供します。実行可能モジュール(LoadLibraryまたはdlopenと同じ機能を本質的に公開します)から関数を動的にロードおよび実行できるインラインABI互換モード(下記の例)とAPIモードをサポートしています。 C拡張モジュール。
ABIインタラクション¶
1 2 3 4 5 6 7 | from cffi import FFI
ffi = FFI()
ffi.cdef("size_t strlen(const char*);")
clib = ffi.dlopen(None)
length = clib.strlen("String to be evaluated.")
# prints: 23
print("{}".format(length))
|
ctypes¶
ctypes はCPythonのC / C ++とのインタフェースのための事実上のライブラリであり、CのネイティブCインタフェースへのフルアクセスだけでなく、 (例えば、Windowsの場合はkernel32、*nixの場合はlibc)、実行時にDLLや共有オブジェクトなどの動的ライブラリを読み込み、インタフェースするためのサポートも提供します。 システムAPIとやりとりするためのさまざまな型の型を持ち合わせており、構造体や共用体などの複雑な型を簡単に定義でき、必要に応じてパディングやアラインメントなどの変更が可能です。 使用するのはちょっと難しいかもしれませんが、 struct モジュールと関連して、基本的にあなたのデータ型 純粋なC(++)メソッドで使用可能なものに変換されます。
構造体の構造¶
MyStruct.h
1 2 3 4 | struct my_struct {
int a;
int b;
};
|
MyStruct.py
1 2 3 4 | import ctypes
class my_struct(ctypes.Structure):
_fields_ = [("a", c_int),
("b", c_int)]
|
SWIG¶
SWIG は、厳密にはPythonに焦点を当てていませんが(スクリプト言語の数が多い)、C/C++ ヘッダーファイルから解釈言語用のバインディングを生成するためのツールです。 消費者はインターフェイスファイル(チュートリアルとドキュメントで詳述)を定義し、必要なC / C ++ヘッダーを組み込み、それらに対してビルドツールを実行するだけで簡単に使用できます。 それにはいくつかの制限がありますが(現在、新しいC ++機能の小さなサブセットに問題があるようで、テンプレートの重いコードを少し冗長にすると少し冗長になります)、多くの機能を提供し、多くの機能を公開します 少しの努力でPythonに さらに、SWIGが(インターフェイスファイル内で)作成したバインディングを演算子や組み込みメソッドのオーバーロードに容易に拡張でき、効果的にC ++例外を再キャストしてPythonなどがキャッチ可能にすることができます。
例: __repr__ のオーバーロード¶
MyClass.h
1 2 3 4 5 6 7 | #include <string>
class MyClass {
private:
std::string name;
public:
std::string getName();
};
|
myclass.i
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | %include "string.i"
%module myclass
%{
#include <string>
#include "MyClass.h"
%}
%extend MyClass {
std::string __repr__()
{
return $self->getName();
}
}
%include "MyClass.h"
|
Boost.Python¶
Boost.Python では、C++オブジェクトの機能を公開するために少し手作業が必要ですが、すべての 同じ機能をSWIGが実行し、C++でPyObjectにアクセスするためのラッパーを提供したり、SWIGラッパーオブジェクトを抽出したり、PythonのビットをC++コードに埋め込んだりすることもできます。