2011-10-18 36 views
3

1)我想用的分析函數Python的C API中捕捉Python解釋器,當它從特定的功能返回。Python的C API - 停止執行(後來繼續吧)

2)我想暫停python解釋器,將執行返回到在我的C++程序中調用解釋器的函數,最後將執行返回給python解釋器,從代碼行開始,直到它停止。我想在執行屬於python的時代之間維護全局和本地。

第1部分我完成了。第2部分是我的問題。我不知道要保存什麼,所以我可以返回執行,或者如果返回執行給定的保存數據。

從我能下車蟒蛇API文檔,我將不得不拯救執行框架的某些部分,但我沒有發現任何東西。一些額外的問題... PyFrameObject包含什麼?令人驚訝的是,python API文檔從來沒有解釋過。

+0

你有沒有嘗試過使用'SIGSTOP' /'SIGCONT'? – Daenyth

+0

我的Python解釋器運行在與我的C++程序相同的線程中......我希望執行在該線程內傳遞,而不是停止整個過程......也許我不完全理解SIGSTOP和SIGCONT會產生的影響在我的程序上?如果是這樣,請解釋。 – Miles

回答

2

如果我理解你的問題,你有一個C++程序在調用蟒蛇。當python完成一個函數的執行時,你需要暫停解釋器並從C++代碼中斷處取出。一段時間後,你的C++程序需要回到python中,並讓python解釋器從中斷處繼續。

我不認爲你可以用一個線程很容易地做到這一點。之前暫停解釋堆棧看起來是這樣的:

[ top of stack ] 
[ some interpreter frames ] 
[ some c++ frames ] 

要暫停的解釋,你需要保存關閉解釋框架,並跳回到最頂層的C++框架。然後爲了取消暫停,您需要恢復解釋器框架,並將堆棧跳到您離開的位置。跳轉是可行的(參見http://en.wikipedia.org/wiki/Setjmp.h),但保存和恢復堆棧更困難。我不知道這樣做的API。

但是你可以用兩個線程來做到這一點。在C++程序開始時創建的線程(稱爲線程1)運行C++代碼,並創建線程2來運行python解釋器。

最初時(當正在運行的C++代碼),線程1正在執行和線程2被阻塞(說條件變量,看https://computing.llnl.gov/tutorials/pthreads/)。當您運行或取消暫停解釋器線程1發送條件變量並等待它。這會喚醒線程2(運行解釋器)並導致線程1被阻塞。當解釋器需要暫停時,線程2發信號通知條件變量並等待(因此線程2阻塞,線程1喚醒)。你可以在線索之間來回跳動,直到心中的內容。希望這可以幫助。

+0

謝謝!我只是在你的答案中搜索詞彙,我不明白,所以現在我明白你的意思了。像魅力一樣工作。 – Miles