在用户类(作为单例类的一部分)中包含pybind11嵌入式模块的正确方法是什么?

时间:2019-02-18 14:32:28

标签: c++ singleton python-c-api pybind11

我有一个Linux C ++动态库,需要将复合结构传递给python,并从python接收结果结构以传输到调用者应用程序。

要在库API函数返回到调用者应用程序后使python解释器“运行”,我决定使用单例类(使用getInstance ...)

对于C / Python API,我正在(尝试...)使用pybind11嵌入式模块机制

问题是如何连接单例类中的嵌入式模块,只是意味着如何从那里调用它(还带有传递的参数)?

看过"calling-embedded-function-in-class-method-using-pybind11",但没有回答我的问题

1 个答案:

答案 0 :(得分:1)

似乎我找到了答案

尽管我正在研究Linux项目,但我发现此链接:Embedding Python in a C++ project with Visual Studio,其示例项目非常有教育意义,

并回顾PDF中的pybind11 embedded documentation,第13.4节,表明这样做很简单:

在C ++类中包含“ py :: module”成员,该成员将使用py :: module :: import(“ module_name”);

然后使用它调用C'tor等

例如:

// class member
py::module mModule;

//initialization
mModule = py::module::import("module_name");
mModule .attr("initialize").call(mArg1, mArg2);

由于这是库中的单例类,而不是main()的常规示例,所以对于解释器的生命周期,我发现最好使用:

py::initialize_interpreter();
{
//call py code...    
}

然后致电 py::finalize_interpreter();毁灭了这个实例

而不是常规py::scoped_interpreter guard{};,它会在作用域结束时结束其寿命