2010-01-02 28 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

相關問題