Py_Initialize 和 Py_finalize 和 MatPlotlib

Posted

技术标签:

【中文标题】Py_Initialize 和 Py_finalize 和 MatPlotlib【英文标题】:Py_Initialize and Py_finalize and MatPlotlib 【发布时间】:2013-05-27 20:00:39 【问题描述】:

这是一个已知问题,但我想请教专家为我解决它的最佳方法。

我有一个项目(欧拉数学工具箱),它将 Python 作为脚本语言运行。为此,在运行时加载了一个库模块“python.dll”,它与“python27.lib”链接。然后调用 Py_Initialize。这一切都很好。

但用户可以使用新的会话和笔记本重新启动 Euler。然后我希望 Python 清除所有变量和导入。为此,我调用 Py_Finalize 并卸载“python.dll”。当需要 Python 时,加载和初始化会再次启动 Python。

这行得通。但是如果在前一个会话中导入了 MatPlotlib,Python 在第一次调用时就会崩溃。似乎 Py_Finalize 并没有完全清除 Python,也没有卸载我的“python.dll”。我尝试卸载“python27.dll”(Python DLL),但这无济于事。最有可能的是,另一个 DLL 保持活动状态,但在 Py_Finalize 期间损坏。

要解决这个问题,清除所有变量和导入就足够了。我可以忍受不调用 Py_Finalize。但是怎么做?

PS:你可能想知道,为什么我不直接将 euler.exe 链接到 Python。原因是这会阻止 Euler 表单启动,如果没有安装 Python,即使它从不需要。

感谢您的任何回答!如果你愿意,你可以在 gmail 复制你对 renegrothmann 的回答。那会帮助我。

【问题讨论】:

【参考方案1】:

要解决这个问题,清除所有变量和导入就足够了。我可以忍受不调用 Py_Finalize。但是怎么做呢?

如果您在每次调用后正确释放所有引用,这应该可以正常工作。只要确保只调用一次Py_Initialize,并且永远不要调用Py_Finalize。使用单独的字典运行每个“会话”,并在完成后始终正确减少引用计数(这将在运行代码后释放这些变量)。

附带说明 - 这是一个常见问题。如果您使用 Py_Finalize,许多其他包(例如 numpy)或任何使用 Boost::Python 编写的包都会表现出相同的行为。

【讨论】:

如何使用“单独的字典”运行?我正在使用“pModule = PyImport_AddModule("main");”加载主模块。然后我使用这个模块,例如对于 PyRun_SimpleString(string)。 @Rene 你不能使用PyRun_SimpleString - 你需要使用PyEval_EvalCode 之类的东西或者让你指定执行代码的字典的替代方法之一。

以上是关于Py_Initialize 和 Py_finalize 和 MatPlotlib的主要内容,如果未能解决你的问题,请参考以下文章

c ++线程等待用户IO('getchar()')在主进程中挂起'Py_Initialize()'

安装 Anaconda 2 后出错:致命 Python 错误:Py_Initialize:无法加载文件系统编解码器

uwsgi部署相关问题Fatal Python error: Py_Initialize: Unable to get the locale encoding

Python 打包exe报错:Py_Initialize: unable to load the file system codec

Python - C 嵌入式分段错误

在 C++ 中嵌入 Python:解释器在执行过程中的持久性