如何在Boost Python中封装初始化/清理函数
我最近发现了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;
}