如何在Boost python中包装init/cleanup函数

ere*_*eOn 6 c++ python boost-python

我最近发现了boost-python的存在,并且很惊讶它的简单性.我想尝试一下并开始包装现有的C++库.

虽然包装基本库API调用非常简单(没有什么特别的,只是常规函数调用和非常常见的参数),但我不知道如何正确包装初始化/清理函数:

就目前而言,我的C++库要求调用者mylib::initialize()在程序启动时首先调用,并mylib::cleanup()在它结束之前调用(实际上还有一个初始化器对象来处理它,但它可能是无关紧要的).

我应该如何使用boost python包装它?

强制Python用户调用mymodule.initialize(),mymodule.cleanup()似乎不是非常pythonic.有没有办法以自动方式?理想情况下,调用initialize()将在导入模块时透明地完成,并且调用cleanup()也在python脚本结束时完成.

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

谢谢.

Rod*_*Rod 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;

}
Run Code Online (Sandbox Code Playgroud)