嵌入时Python 3解释器是否会泄漏内存?

此错误报告指出,截至2007年6月,Python解释器在使用嵌入式Python解释器的C / C ++应用程序中调用Py_Finalize后,将不会清除所有已分配的内存。 建议在应用程序终止时调用Py_Finalize一次。

此错误报告指出,从版本3.3和2011年3月开始,解释器仍会泄漏内存。

有谁知道这个问题的当前状态? 我很担心,因为我有一个应用程序,其中每个运行实例多次调用解释器,我遇到内存泄漏。

我已经使用boost :: python来处理引用计数,并清除了在运行之间运行Python程序所创建的所有引用的全局字典。 我有一些单身人士课 – 这可能是问题吗?

这是一个易处理的问题还是Python解释器中的错误?

你可以看到这个bug(第一个,从2007年开始)被nnorwitz关闭为“wontfix”,他的post在bug报告中。

为什么Py_Initialize/Py_Finalize调用Py_Initialize/Py_Finalize ? 为什么不做这样的事情(为了方便,我有点混合C和Python):

 /* startup */ Py_Initialize(); /* do whatever */ while (moreFiles()) { PyRun_SimpleString("execfile('%s')" % nextFile()); /* do whatever */ } /* shutdown */ Py_Finalize(); 

问题是,大多数编写Python模块的人不担心如果他们的模块最终完成并重新初始化会发生什么,并且通常不关心在最终确定期间进行清理。 模块作者知道,当进程退出时,所有内存都会被释放,并且不会为此而烦恼。

所以它不是一个真正的错误,它实际上是一千个错误 – 每个扩展模块一个错误。 对于影响少数用户的bug来说,这是一项巨大的工作,其中大多数用户都有可行的解决方法。

你总是可以省略对Py_Finalize调用,第二次调用Py_Initialize是一个无操作。 这意味着当您第一次运行Python脚本时,您的应用程序将使用额外的内存使用量,并且在您退出之前,额外的内存将不会返回到操作系统。 只要您每隔一段时间仍在运行Python脚本,我就不会将其归类为泄漏。 您的应用可能不是Valgrind-clean,但它比筛子漏水更好。

如果您需要卸载(纯)Python模块以避免泄漏内存,您可以这样做。 只需从sys.modules删除它们即可。

Py_Finalize缺点:如果您反复执行Python脚本,在它们之间运行Py_Finalize没有多大意义。 每次重新初始化时,您都必须重新加载所有模块; 我的Python在启动时加载了28个模块。

补充评论:错误不仅限于Python。 如果您尝试卸载和重新加载库,则任何语言中的大量库代码都会泄漏内存。 许多库调用C代码,许多C程序员假设他们的库被加载一次并在进程退出时卸载。