Python から C/C++ を呼び出していますか?

ctypes モジュールは標準ライブラリの一部であるため、常に問題を引き起こしがちだった swig よりも安定しており、広く利用できます。

ctypes では、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

Boost.Python を見てください。以下は、彼らのウェブサイトから抜粋した簡単な紹介です:


これを行う最も簡単な方法は、SWIG を使用することです。

SWIG チュートリアルの例:

/* File : example.c */
int fact(int n) {
    if (n <= 1) return 1;
    else return n*fact(n-1);
}

インターフェイス ファイル:

/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern int fact(int n);
%}

extern int fact(int n);

Unix で Python モジュールを構築する:

swig -python example.i
gcc -fPIC -c example.c example_wrap.c -I/usr/local/include/python2.7
gcc -shared example.o example_wrap.o -o _example.so

使い方:

>>> import example
>>> example.fact(5)
120

python-dev が必要であることに注意してください。また、一部のシステムでは、Python ヘッダー ファイルは、インストール方法に基づいて /usr/include/python2.7 にあります。

チュートリアルから: