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

问题描述 投票:0回答:1

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

为了在库API函数返回调用者应用程序之后让python解释器“活着”,我决定使用singleton类(使用getInstance ...)

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

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

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

c++ singleton python-c-api pybind11
1个回答
2
投票

似乎我找到了答案

虽然我正在研究一个Linux项目,但我发现这个链接:Embedding Python in a C++ project with Visual Studio及其示例项目,非常有教育意义,

回顾pybind11 embedded documentation,PDF格式的第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{};,它在范围的最后完成了它的生命周期

© www.soinside.com 2019 - 2024. All rights reserved.