CPython中从C代码调用Python函数的机制是什么?

2024-09-19 23:56:52 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我正在编写一个cpythonc扩展,在它里面我想调用一些用Python编写的函数

互联网建议它包括从C扩展调用PyObject *PyObject_Call()。是这样吗

如果是,我想了解VM中调用被调用Python函数的机制。我花了很多时间阅读了PyObject *PyObject_Call()的源代码,但无法完全理解正在发生的事情,因此我们将非常感谢您的指导

下列哪一项是正确的

  1. VM推送一个新的堆栈帧,等等,然后等待下一个eval循环迭代自然地将控制切换到被调用的Python函数

  2. VM调用新的字节码解释循环,以便立即解释被调用的函数

  3. 还有别的吗


Tags: 函数字节源代码堆栈eval时间vm互联网
1条回答
网友
1楼 · 发布于 2024-09-19 23:56:52

现在是2点。这也是用于从Python代码中调用Python函数的相同机制。每个Python堆栈帧使用一个字节码求值循环实例,并且求值循环是可重入的

PyObject_Call是一个合适的函数。(还有其他的,有时可能更方便,但是PyObject_Call是通用的。)您可能无法理解它的功能,因为它只是一个调度器。它委托被调用对象实现函数调用操作符

对于普通的Python函数对象,您可以在Objects/funcobject.c中找到^{},您可以通过^{}跟踪调用,最终跟踪到^{}。它调用interp->eval_frame,其中defaults^{},其中包含字节码求值循环

相关问题 更多 >