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
}