我需要使用boost::python
,但我希望在python交互完成后销毁解释器上下文。
如何以及何时实例化python解释器,以及如何销毁它分配的所有资源?
更新显然Py_Finalize
并非设计为在同一进程中多次调用。看来这种方法不起作用:http://docs.python.org/2/c-api/init.html#l2h-652
答案 0 :(得分:0)
Py_Finalize旨在每个进程只调用一次。我处理它的方法是将它放入我们应用程序的关闭钩子中,或者在main函数的末尾运行它。您可以拥有解释器上下文的多个实例,并且当它们的“__main__”对象(由import(“__ main__”)创建的对象)被销毁时,它们会被清理。
答案 1 :(得分:0)
Boost.Python不支持安全地调用Py_Finalize()
。
根据Embedding - Getting started部分:
请注意,此时您不得致电
Py_Finalize()
来停止翻译。这可以在boost.python的未来版本中修复。
TODO中注明了其他详细信息。简而言之,一些内部Boost.Python对象将在Py_Finalize()
期间保持活动状态,并且仅在Boost.Python卸载时尝试删除,从而导致对象尝试使用不存在的解释器进行删除。