3

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

我有一个项目(欧拉数学工具箱),它将 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 的回答。那会帮助我。

4

1 回答 1

1

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

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

附带说明 - 这是一个常见问题。如果您使用Py_Finalize.

于 2013-05-27T20:12:11.010 回答