Pythonの呼び出しC / C ++の機能

PythonのコールC / C ++の機能。
Pythonは間違いなく高いC ++よりも符号化率が、時には私たちは、今回のC ++のいくつかのライブラリを使用する必要があり、あなたが達成するために、C / C ++の関数を呼び出すのPythonを使用することができます。
C / C ++セクション
ファーストクラスを定義します

class Foo{
public:
    double x = 0;
public:
    double bar(double t){
        x = t;
        std::cout << "c++ " << x << std::endl;
        return x;
    }
};
// 封装C接口
extern "C"{
// 创建对象
Cbacken* cbacken_new(){
    return new Cbacken;
}
void cbacken_sort(Cbacken* cb, int *arr, int n){
    cb->sort(arr, n);
}
Foo* Foo_new(){ return new Foo(); }
double Foo_bar(Foo* cb, double t){
    double m = t;
    cb->bar(m);
    std::cout << "c " << m << "\n";
    return m;
    //return foo->bar();
    }
}

Pythonの一部

class Foo(object):
    def __init__(self):
        self.obj = lib.Foo_new()

    def bar(self):
        lib.Foo_bar.argtypes = [ctypes.c_double]
        lib.Foo_bar.restype = ctypes.c_double
        print("python: ", lib.Foo_bar(ctypes.c_double(10.1)))

if __name__ == '__main__':
    f = Foo()
    f.bar()

これは注目すべきポイントです。

  1. = lib.Foo_bar.argtypes [ctypes.c_double]
    lib.Foo_bar.restype = ctypes.c_double
    指定された戻り値は、主に使用さRESTYPE。パラメータを指定する場合、fooは* CB、考慮されてする必要はありません、それは第二の開発を指示することができます。
  2. あなたはpythonで呼び出すと、)(ctypes.c_double(10.1))のクラスオブジェクトlib.Foo_barのself.objを指定する必要はありません。
    C ++のコンパイラ:
    SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY CMAKE_BINARY_DIR} {$ / ... /)
    (SHAREDのTEST.CPP test_lib)add_library

参考文献:

  1. https://stackoverflow.com/questions/22391229/ctypes-returns-wrong-result
  2. https://docs.python.org/3/library/ctypes.html
公開された36元の記事 ウォンの賞賛3 ビュー10000 +

おすすめ

転載: blog.csdn.net/wang_jun_whu/article/details/99111928