这是一个已知问题,但我想请专家为我解决这个问题的最佳方法。
我有一个项目(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。那会对我有帮助。
为了解决这个问题,清除所有变量和导入就足够了。我可以忍受不调用 Py_Finalize。但如何呢?
如果您在每次调用后正确释放所有引用,那么这应该可以正常工作。只需确保仅致电Py_Initialize
一次,并且从不打电话Py_Finalize
。使用单独的字典运行每个“会话”,并在完成后始终正确减少引用计数(这将在运行代码后释放这些变量)。
附带说明 - 这是一个常见问题。许多其他包,例如 numpy,或使用 Boost::Python 编写的任何包,如果您使用Py_Finalize
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)