====== pybind11 ======
C/C++ のコードを python で利用する。\\
個人的には、boost よりも使いやすい。
===== 基本 =====
#include
#include
#include
#include
void functionInPython(void){
std::cout << "call functionInCPP\n";
}
class ClassInCpp {
public:
ClassInCpp(void) : varInClassInCpp("varInClassInCpp"){ }
std::string varInClassInCpp ;
void functionClassInCpp(void){
std::cout << "call functionClassInCpp\n";
}
template
TT1 templateFunctionInCpp(TT1 x){
std::cout << "call templateFunctionInCpp -arg= " << x << "\n";
return x * x;
}
};
PYBIND11_MODULE(examplePybind11, m) {
m.def("functionInPython", &functionInPython);
pybind11::class_(m, "classInPython")
.def(pybind11::init<>())
.def_readwrite("varInPython", &ClassInCpp::varInClassInCpp)
.def("functionClassInPython", &ClassInCpp::functionClassInCpp)
// template function
.def("templateFunctionInPython",
(uint64_t (ClassInCpp::*)(uint64_t)) &ClassInCpp::templateFunctionInCpp)
.def("templateFunctionInPython",
(float (ClassInCpp::*)(float )) &ClassInCpp::templateFunctionInCpp);
}
===== complile =====
==== Linux/Mac の場合 ====
c++ exPybind11.cpp -o examplePybind11.so -std=c++11 -shared -fPIC \
-I"pybindIncludeDir" \
`/usr/bin/python3-config --cflags --ldflags`
ここで、**examplePybind11.so** の prefix (".so" を除外した部分) は、\\
"PYBIND11_MODULE(examplePybind11, m)" の第一引数と同じこと。
==== Windows の場合 ====
コンパイラや環境に依存すると思われる。\\
以下は、"UCRT64/mingw-w64-ucrt-x86_64-python 3.12.11-1" の場合。
c++ exPybind11.cpp -o examplePybind11`python-config --extension-suffix` \
-std=c++11 -shared -fPIC \
-I"pybind11IncludeDir" \
`python-config --cflags --ldflags`
上記の -I"pybind11IncludeDir" は環境にあわせる。
----
===== python での使用方法 =====
import os
import sys
import examplePybind11
examplePybind11.functionInPython()
c = examplePybind11.classInPython()
print(c.varInPython)
c.functionClassInPython()
v = c.templateFunctionInPython(2)
print (v)
v = c.templateFunctionInPython(1.1)
print (v)
-----
===== list の使用 =====
void func(pybind11:list pylist){
for (uint64_t i=0; i();
}
}
----
===== threading/pthead などでの利用 =====
python で threading からの呼び出しでは、独立スレッドにならない。
独立スレッドにするために、以下のコードを挿入する。
void function(void){
pybind11::gil_scoped_release release;
// 処理
pybind11::gil_scoped_acquire acquire;
}