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()
これは注目すべきポイントです。
- = lib.Foo_bar.argtypes [ctypes.c_double]
lib.Foo_bar.restype = ctypes.c_double
指定された戻り値は、主に使用さRESTYPE。パラメータを指定する場合、fooは* CB、考慮されてする必要はありません、それは第二の開発を指示することができます。 - あなたは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
参考文献: