假设我正在编写一个cpythonc扩展,在它里面我想调用一些用Python编写的函数
互联网建议它包括从C扩展调用PyObject *PyObject_Call()
。是这样吗
如果是,我想了解VM中调用被调用Python函数的机制。我花了很多时间阅读了PyObject *PyObject_Call()
的源代码,但无法完全理解正在发生的事情,因此我们将非常感谢您的指导
下列哪一项是正确的
VM推送一个新的堆栈帧,等等,然后等待下一个eval循环迭代自然地将控制切换到被调用的Python函数
VM调用新的字节码解释循环,以便立即解释被调用的函数
还有别的吗
现在是2点。这也是用于从Python代码中调用Python函数的相同机制。每个Python堆栈帧使用一个字节码求值循环实例,并且求值循环是可重入的
PyObject_Call
是一个合适的函数。(还有其他的,有时可能更方便,但是PyObject_Call
是通用的。)您可能无法理解它的功能,因为它只是一个调度器。它委托被调用对象实现函数调用操作符对于普通的Python函数对象,您可以在} ,您可以通过^{} 跟踪调用,最终跟踪到^{} 。它调用} ,其中包含字节码求值循环
Objects/funcobject.c
中找到^{interp->eval_frame
,其中defaults到^{相关问题 更多 >
编程相关推荐