lang:c:pybind11
pybind11
C/C++ のコードを python で利用する。
個人的には、boost よりも使いやすい。
基本
- exPybind11.cpp
#include <iostream> #include <cstdio> #include <cstdlib> #include <pybind11/pybind11.h> 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 <typename TT1> TT1 templateFunctionInCpp(TT1 x){ std::cout << "call templateFunctionInCpp -arg= " << x << "\n"; return x * x; } }; PYBIND11_MODULE(examplePybind11, m) { m.def("functionInPython", &functionInPython); pybind11::class_<ClassInCpp>(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 での使用方法
- example.py
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 の使用
- list.cpp
void func(pybind11:list pylist){ for (uint64_t i=0; i<pylist.size(); i++){ pybind11::handle item = pylist[i]; std::string x = item.cast<std::string>(); } }
threading/pthead などでの利用
python で threading からの呼び出しでは、独立スレッドにならない。 独立スレッドにするために、以下のコードを挿入する。
- thread.cpp
void function(void){ pybind11::gil_scoped_release release; // 処理 pybind11::gil_scoped_acquire acquire; }
lang/c/pybind11.txt · 最終更新: by editor