2010-01-02 79 views
1

我有一个嵌入Python解释器的C++应用程序。代码中有些地方可能会解释器中断,我需要确保解释器处于“安全”状态才能执行新代码。我只是调用Py_Finalize并重新初始化所有东西,除了我有一堆PyObject *引用,我需要保持有效。有没有这样做的功能,还是甚至有必要?当我提到口译员正在被打断时,我的意思是一个seg。我的应用尝试从中恢复的故障或访问冲突。如何将Python解释器重置为“安全”状态?

+1

什么是安全状态?处于不安全状态的后果是什么?是什么让你觉得它可能处于不安全的状态?您是否编写了一些嵌入在以不安全状态结束的应用中的其他语言?结果是什么?您可能想详细说明其中的一个或所有问题。这很有说服力,三个小时后,没有人发布回复。 – hughdbrown 2010-01-03 02:57:13

+0

好的。一个安全的状态将是我可以在脚本中调用函数的一个点。如果函数被调用,那么不安全的状态将会发生致命错误。我从来没有嵌入解释器,我很少编写异常处理代码。希望有所帮助。 – 2010-01-03 05:36:19

回答

2

呃,试图从段错误或访问冲突“恢复”是相当危险的。你首先得到这些信息的原因是,你的程序试图做一些它本不应该做的事情;因此它遇到了错误或无法预料的情况。

在这种情况下,Python解释器没有规定回滚到“安全点”。即使最终确定并重新初始化解释器,也可能会使一些静态数据处于不一致的状态。

如果您告诉我们您为什么试图这样做,我们可能会提出一个替代方案。

+0

我的应用程序嵌入了Python解释器,允许第三方扩展它。我自己的一些脚本(特别是tkinter脚本)由于某种原因崩溃并进行调试告诉我有问题的代码位于python31.dll – 2010-01-03 20:25:38

+0

然后唯一理智的答案是尝试找出究竟是什么崩溃,并修复它和/或绕过它和/或向http://bugs.python.org报告错误:-) – 2010-01-03 22:49:20

+0

嗯,我试了一下,它的工作原理!我首先调用SetUnhandledExceptionFilter,然后当发生访问冲突时,我的函数被调用。然后,我简单地增加注册EIP,直到麻烦的代码过去,然后恢复。当然,用户被告知他应该保存他的工作并重新启动,但它确实有效。 – 2010-01-04 02:09:51