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