C または C++ ライブラリへの Python バインディングを構築する最も簡単な方法は何でしょうか?
(これが問題であれば、私は Windows を使用しています。)
ベストアンサー1
ctypesモジュールは標準ライブラリの一部であるため、より安定しており、広く利用可能です。ガブガブ飲むいつも私に問題。
ctypes を使用する場合、Python に対するコンパイル時の依存関係を満たす必要があり、バインディングは、コンパイルされた Python だけでなく、ctypes を持つすべての Python で機能します。
foo.cpp というファイルに、通信したい単純な C++ サンプル クラスがあるとします。
#include <iostream>
class Foo{
public:
void bar(){
std::cout << "Hello" << std::endl;
}
};
ctypesはC関数としか通信できないため、それらをextern "C"として宣言する必要があります。
extern "C" {
Foo* Foo_new(){ return new Foo(); }
void Foo_bar(Foo* foo){ foo->bar(); }
}
次にこれを共有ライブラリにコンパイルする必要があります
g++ -c -fPIC foo.cpp -o foo.o
g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o
そして最後に、Python ラッパーを記述する必要があります (例: fooWrapper.py)
from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')
class Foo(object):
def __init__(self):
self.obj = lib.Foo_new()
def bar(self):
lib.Foo_bar(self.obj)
それができたら、次のように呼び出すことができます
f = Foo()
f.bar() #and you will see "Hello" on the screen