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

问题描述 投票:1回答:1

假设我正在编写CPython C扩展,并且在其中要调用一些用Python编写的函数。

互联网建议涉及从C分机呼叫PyObject *PyObject_Call()。是这样吗?

如果是的话,我想了解VM内调用调用的Python函数的机制。我已经花了一些时间浏览PyObject *PyObject_Call()的源代码,但无法完全掌握正在发生的事情,因此将对您的指导有所帮助。

以下哪一项是正确的?

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

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

  3. 还有什么?

python virtual-machine cpython
1个回答
2
投票
PyObject_Call是适合使用的功能。 (还有其他功能,有时可能更方便,但是PyObject_Call是通用的。)您可能很难理解它的作用,因为它只是一个调度程序。它委托给函数调用操作符的被调用对象的实现。

对于普通的Python函数对象,您可以在function_call中找到它为function_call,并且可以从Objects/funcobject.c向下追溯到_PyFunction_FastCallDict。调用_PyFunction_FastCallDict,其中PyEval_EvalFrameExPyEval_EvalFrameEx,其中包含字节码评估循环。

© www.soinside.com 2019 - 2024. All rights reserved.