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

use*_*116 4 c python embedding python-embedding python-c-api

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

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

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

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

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

Die*_*Epp 6

你可以看到这个bug(第一个,从2007年开始)被nnorwitz关闭为"wontfix",他的帖子在bug报告中.

你为什么Py_Initialize/Py_Finalize不止一次打电话?为什么不做这样的事情(为了方便,我有点混合C和Python):

/* startup */
Py_Initialize();

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

/* shutdown */
Py_Finalize();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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