假设我正在编写一个CPython C扩展,并且在其中要调用一些用Python编写的函数。
互联网建议涉及PyObject *PyObject_Call()
从C分机拨打电话。是这样吗?
如果是这样,我想了解VM内调用调用的Python函数的机制。我已经花了一些时间浏览的源代码PyObject *PyObject_Call()
,但无法完全掌握正在发生的事情,因此将对您的指导有所帮助。
以下哪一项是正确的?
VM推送一个新的堆栈框架,等等-但是然后等待下一个eval循环迭代以自然地将控制切换到调用的Python函数
VM调用新的字节码解释循环,以便立即解释被调用的函数
还有吗
它是2。这也是从Python代码中调用Python函数所用的相同机制。每个Python堆栈帧都使用字节码评估循环的一个实例,并且评估循环是可重入的。
PyObject_Call
是适合使用的功能。(还有其他一些功能,有时可能更方便,但是PyObject_Call
是通用的。)您可能很难理解它的功能,因为它只是一个调度程序。它委托给函数调用操作符的被调用对象的实现。
对于普通的Python函数对象,你可以发现,作为function_call
中Objects/funcobject.c
,你可以跟踪通话向下_PyFunction_FastCallDict
,最终下跌至PyEval_EvalFrameEx
。该调用interp->eval_frame
,默认为_PyEval_EvalFrameDefault
,其中包含字节码评估循环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句