嵌入式 python 在 c++ class 中使用 pybind11:如何从 python 调用 c++ class 的成员函数
embedded python using pybind11 in c++ class: how to call member function of c++ class from python
我有一个 class 和一个方法 (MyClass::methodWithPy),可以通过使用嵌入式 pybind11 的一些 python 脚本自定义,目前有效。
在 python 脚本中,我需要以某种方式调用 c++ class 的方法。这有可能吗?
这是我目前所知道的,但我不知道如何从 python.
中调用 class 方法
class MyClass
{
public:
MyClass();
double pureCMethod(double d);
void methodWithPy();
private:
double m_some_member;
};
// method of the c++ class that has acess to members and does some computation
double MyClass::pureCMethod(double d)
{
// here we have some costly computation
return m_some_member*d;
}
// 2nd method of the c++ class that uses embedded python
void MyClass::methodWithPy()
{
namespace py = pybind11;
using namespace py::literals;
py::scoped_interpreter guard{};
py::exec(R"(
print("Hello From Python")
result = 23.0 + 1337
result = MyClass::pureCMethod(reslut) // pseudocode here. how can I do this?
print(result)
)", py::globals());
}
感谢@unddoch link。这让我找到了答案。
PYBIND11_EMBEDDED_MODULE 是我遗漏的部分。
首先,您需要定义一个包含 class 和方法的嵌入式 python 模块:
PYBIND11_EMBEDDED_MODULE(myModule, m)
{
py::class_<MyClass>(m, "MyClass")
.def("pureCMethod", &MyClass::pureCMethod);
}
然后将class传递给python(先导入模块)
auto myModule = py::module_::import("myModule");
auto locals = py::dict("mc"_a=this); // this pointer of class
现在可以从 python
访问成员方法
py::exec(R"(
print("Hello From Python")
print(mc.pureCMethod(23))
)", py::globals(), locals);
我有一个 class 和一个方法 (MyClass::methodWithPy),可以通过使用嵌入式 pybind11 的一些 python 脚本自定义,目前有效。
在 python 脚本中,我需要以某种方式调用 c++ class 的方法。这有可能吗?
这是我目前所知道的,但我不知道如何从 python.
中调用 class 方法class MyClass
{
public:
MyClass();
double pureCMethod(double d);
void methodWithPy();
private:
double m_some_member;
};
// method of the c++ class that has acess to members and does some computation
double MyClass::pureCMethod(double d)
{
// here we have some costly computation
return m_some_member*d;
}
// 2nd method of the c++ class that uses embedded python
void MyClass::methodWithPy()
{
namespace py = pybind11;
using namespace py::literals;
py::scoped_interpreter guard{};
py::exec(R"(
print("Hello From Python")
result = 23.0 + 1337
result = MyClass::pureCMethod(reslut) // pseudocode here. how can I do this?
print(result)
)", py::globals());
}
感谢@unddoch link。这让我找到了答案。 PYBIND11_EMBEDDED_MODULE 是我遗漏的部分。
首先,您需要定义一个包含 class 和方法的嵌入式 python 模块:
PYBIND11_EMBEDDED_MODULE(myModule, m)
{
py::class_<MyClass>(m, "MyClass")
.def("pureCMethod", &MyClass::pureCMethod);
}
然后将class传递给python(先导入模块)
auto myModule = py::module_::import("myModule");
auto locals = py::dict("mc"_a=this); // this pointer of class
现在可以从 python
访问成员方法py::exec(R"(
print("Hello From Python")
print(mc.pureCMethod(23))
)", py::globals(), locals);