pybind模块的初始化和结束
Initialization and finalization of pybind module
我正在封装一些 C++ 库代码来创建一个 pybind11 模块。我采用此处描述的方法:
https://github.com/pybind/cmake_example
构建库后,将使用类似以下内容将其导入 Python:
import cmake_example as m
为了使用,需要对库进行初始化。在初始化期间,代码读取一些环境变量,设置一些内部变量,打印一些东西,等等。另外,还有定稿。
如何保证初始化和终结代码总是运行?一种方法是做类似
的事情
import cmake_example as m
m.init()
#use module
m.finalize()
但是,为了使库更易于使用,我会考虑在 c++ 端处理此问题:通过向 c++ 代码添加内容以确保在导入模块时和在调用模块时分别自动调用 init 和 cleanup python script/session 结束。
我可以想象这可以通过添加自定义类型的静态变量来实现,并在自定义类型初始化时调用初始化代码,在完成时调用清理代码。类似于:
#include <pybind11/pybind11.h>
#include <iostream>
class Module
{
public:
Module()
{
std::cout << "initializing";
//code initialization
}
~Module()
{
std::cout << "finalizing";
//finalize
}
};
static Module module;
namespace py = pybind11;
PYBIND11_MODULE(pybind_example, m) {
//Create all the bindings.
}
当我针对当前设置 (windows、python 2.9) 对其进行测试时,这似乎有效?它会突然中断其他配置吗?是否有推荐的替代方案?
您的方法可行,但它非常脆弱,您可能 运行 进入
一种更稳健的方法是在 pybind 范围内初始化一个静态变量:
PYBIND11_MODULE(pybind_example, m) {
static Module module;
// Create bindings
}
我正在封装一些 C++ 库代码来创建一个 pybind11 模块。我采用此处描述的方法:
https://github.com/pybind/cmake_example
构建库后,将使用类似以下内容将其导入 Python:
import cmake_example as m
为了使用,需要对库进行初始化。在初始化期间,代码读取一些环境变量,设置一些内部变量,打印一些东西,等等。另外,还有定稿。
如何保证初始化和终结代码总是运行?一种方法是做类似
的事情import cmake_example as m
m.init()
#use module
m.finalize()
但是,为了使库更易于使用,我会考虑在 c++ 端处理此问题:通过向 c++ 代码添加内容以确保在导入模块时和在调用模块时分别自动调用 init 和 cleanup python script/session 结束。
我可以想象这可以通过添加自定义类型的静态变量来实现,并在自定义类型初始化时调用初始化代码,在完成时调用清理代码。类似于:
#include <pybind11/pybind11.h>
#include <iostream>
class Module
{
public:
Module()
{
std::cout << "initializing";
//code initialization
}
~Module()
{
std::cout << "finalizing";
//finalize
}
};
static Module module;
namespace py = pybind11;
PYBIND11_MODULE(pybind_example, m) {
//Create all the bindings.
}
当我针对当前设置 (windows、python 2.9) 对其进行测试时,这似乎有效?它会突然中断其他配置吗?是否有推荐的替代方案?
您的方法可行,但它非常脆弱,您可能 运行 进入
一种更稳健的方法是在 pybind 范围内初始化一个静态变量:
PYBIND11_MODULE(pybind_example, m) {
static Module module;
// Create bindings
}