我遇到类似于Py_initialize / Py_Finalize的问题,不能与numpy一起使用两次的情况。C中的基本编码:
Py_Initialize(); import_array(); //Call a python function which imports numpy as a module //Py_Finalize()
该程序处于循环中,如果python代码将numpy作为导入的模块之一,则会发出段错误。如果我删除numpy,它可以正常工作。
作为临时工作,我尝试不使用Py_Finalize(),但这会导致大量内存泄漏(随着TOP的内存使用量不断增加而观察到)。我试过但不理解我发布的那个链接中的建议。有人可以建议使用numpy等导入时完成呼叫的最佳方法吗?
谢谢桑索什。
我不太确定您似乎不理解Py_initialize / Py_Finalize中发布的解决方案不能与numpy一起使用两次。发布的解决方案非常简单:每次执行程序时,仅调用一次Py_Initialize和Py_Finalize。不要在每次运行循环时都调用它们。
我假设您的程序在启动时会运行一些初始化命令(只能运行一次)。在此处调用Py_Initialize。永远不要再打电话了。另外,我假设您的程序终止时,它具有一些代码来拆卸东西,转储日志文件等。在那里调用Py_Finalize。Py_Initialize和Py_Finalize不能帮助您在Python解释器中管理内存。请勿为此使用它们,因为它们会导致程序崩溃。取而代之的是,使用Python自己的函数来摆脱不需要保留的对象。
如果您确实必须在每次运行代码时都创建一个新环境,则可以使用Py_NewInterpreter并创建一个子解释器,然后使用Py_EndInterpreter销毁该子解释器。它们记录在Python C API页面底部附近。这与拥有新的解释器的工作方式相似,除了每次子解释器启动时不会重新初始化模块。