Py_Initialize和Py_finalize以及MatPlotlib

时间:2013-05-27 20:00:40

标签: python euler-math-toolbox

这是一个众所周知的问题,但我想请专家为我解决这个问题的最佳方法。

我有一个项目(Euler Math Toolbox),它将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。原因是如果没有安装Python,这会阻止Euler表单启动,即使从不需要它。

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

1 个答案:

答案 0 :(得分:1)

  

要解决这个问题,清除所有变量和导入就足够了。我可以忍住不叫Py_Finalize。但是如何?

如果您在每次通话后正确释放所有引用,这应该可以正常工作。只需确保一次只能拨打Py_Initialize,而不要拨打Py_Finalize。使用单独的字典运行每个“会话”,并且在完成它们之后总是正确地减少引用计数(这将在运行代码后释放这些变量)。

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