2011-10-18 30 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