gpt4 book ai didi

c++ - 如何在 Boost python 中包装一个 init/cleanup 函数

转载 作者:太空狗 更新时间:2023-10-29 22:23:50 25 4
gpt4 key购买 nike

我最近发现了 boost-python 的存在,并对它明显的简单性感到惊讶。我想试一试并开始包装现有的 C++ 库。

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

目前,我的 C++ 库要求调用者在程序启动时首先调用 mylib::initialize(),然后调用 mylib::cleanup()在它结束之前(实际上还有一个初始化对象负责处理这个问题,但它可能无关紧要)。

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

强制 Python 用户调用 mymodule.initialize()mymodule.cleanup() 似乎不是很 pythonic。有什么办法可以自动实现吗?理想情况下,对 initialize() 的调用将在导入模块时透明地完成,对 cleanup() 的调用也在 python 脚本结束时完成。

有什么办法吗?如果不是,最优雅的解决方案是什么?

谢谢。

最佳答案

您可以尝试做一个守卫对象并将其分配给模块的隐藏属性。

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;

}

关于c++ - 如何在 Boost python 中包装一个 init/cleanup 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5406334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com