小编典典

Python-C嵌入式细分错误

python

我遇到类似于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等导入时完成呼叫的最佳方法吗?

谢谢桑索什。


阅读 121

收藏
2020-12-20

共1个答案

小编典典

我不太确定您似乎不理解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
页面底部附近。这与拥有新的解释器的工作方式相似,除了每次子解释器启动时不会重新初始化模块。

2020-12-20