ユーザ用ツール

サイト用ツール


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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki