1) 当 python 解释器从特定函数返回时,我想使用 Python C API 中的分析函数来捕获它。
2) 我想暂停 python 解释器,将执行发送回在我的 C++ 程序中调用解释器的函数,最后将执行返回给 python 解释器,在它停止的代码行上启动它。我想在执行属于 python 的时间之间维护全局变量和局部变量。
第 1 部分我已经完成了。第 2 部分是我的问题。我不知道要保存什么以便返回执行,或者如何根据保存的数据返回执行。
根据我可以从 python API 文档中得到的信息,我将不得不保存执行框架的某些部分,但我还没有找到任何东西。一些额外的问题... PyFrameObject 究竟包含什么?令人惊讶的是,Python API 文档从未解释过这一点。
最佳答案
如果我理解你的问题,你有一个调用 python 的 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 唤醒)。您可以随心所欲地在线程之间来回跳动。希望这会有所帮助。
关于c++ - Python C API - 停止执行(稍后继续执行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7809321/