如何在Boost Python中封装初始化/清理函数

6 投票
1 回答
1166 浏览
提问于 2025-04-16 14:15

我最近发现了boost-python这个东西,觉得它看起来很简单。我想试试,于是开始把一个现有的C++库封装起来。

封装基本的库API调用其实很简单(没什么特别的,就是普通的函数调用和一些常见的参数),但我不知道怎么正确地封装初始化和清理的函数:

目前,我的C++库要求调用者在程序开始时先调用mylib::initialize(),在程序结束前调用mylib::cleanup()(实际上还有一个初始化对象来处理这些,但这可能不太重要)。

我该如何用boost-python来封装这些呢?

强迫Python用户去调用mymodule.initialize()mymodule.cleanup()似乎不太符合Python的风格。有没有办法让这个过程自动化?理想情况下,调用initialize()应该在模块被导入时自动进行,而调用cleanup()也应该在Python脚本结束时自动进行。

有没有办法做到这一点?如果没有,最优雅的解决方案是什么?

谢谢。

1 个回答

9

你可以试着创建一个保护对象,然后把它分配给你模块的一个隐藏属性。

struct MyLibGuard
{
    MyLibGuard() { myLib::initialize();}
    ~MyLibGuard() { myLib::cleanup();}
};

using namespace boost::python;

BOOST_PYTHON_MODULE(arch_lib)
{
    boost::shared_ptr<MyLibGuard> libGuard = new MyLibGuard();

    class_<MyLibGuard, boost::shared_ptr<MyLibGuard>, boost::noncopyable>("MyLibGuard", no_init);
    scope().attr("__libguard") = libGuard;

}

撰写回答