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++コードに埋め込んだりすることもできます。