内容へ移動
SlightKnowledge
ユーザ用ツール
ログイン
サイト用ツール
検索
ツール
文書の表示
以前のリビジョン
バックリンク
最近の変更
メディアマネージャー
サイトマップ
ログイン
>
最近の変更
メディアマネージャー
サイトマップ
トレース:
lang:c:pybind11
この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。
====== pybind11 ====== C/C++ のコードを python で利用する。\\ 個人的には、boost よりも使いやすい。 ===== 基本 ===== <file python 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); } </file> ===== 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 での使用方法 ===== <file 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) </file> ----- ===== list の使用 ===== <file python 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>(); } } </file> ---- ===== threading/pthead などでの利用 ===== python で threading からの呼び出しでは、独立スレッドにならない。 独立スレッドにするために、以下のコードを挿入する。 <file c++ thread.cpp> void function(void){ pybind11::gil_scoped_release release; // 処理 pybind11::gil_scoped_acquire acquire; } </file>
lang/c/pybind11.txt
· 最終更新:
2025/09/06 12:45
by
editor
ページ用ツール
文書の表示
以前のリビジョン
バックリンク
文書の先頭へ