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

阿维夫·科恩(Aviv Cohn)

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

互联网建议涉及PyObject *PyObject_Call()从C分机拨打电话是这样吗?

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

以下哪一项是正确的?

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

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

  3. 还有吗

user2357112支持Monica

它是2。这也是从Python代码中调用Python函数所用的相同机制。每个Python堆栈帧都使用字节码评估循环的一个实例,并且评估循环是可重入的。

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

对于普通的Python函数对象,你可以发现,作为function_callObjects/funcobject.c,你可以跟踪通话向下_PyFunction_FastCallDict,最终下跌至PyEval_EvalFrameEx该调用interp->eval_frame默认_PyEval_EvalFrameDefault,其中包含字节码评估循环。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

python中read()函数的代码是什么?

当多次调用具有多个参数的函数时,python中减少代码重复的好方法是什么?

在C ++中调用构造函数的正确方法是什么?

C ++ lambda的机制是什么?

socket()函数的内部机制是什么?

这段代码中的.arr函数是什么?

伪代码中的jQuery函数是什么?

R中的调用函数是什么?

在Python中中断嵌套函数/构造函数调用的正确方法是什么?

以下代码在cpython中做什么

Redis中的快照机制是什么?

有什么方法可以在CPython中创建函数时执行代码?

Keras自定义损失函数访问python的全局变量时的内部机制是什么?

在C#,if语句或对什么都不做的函数的虚函数调用中,最快的是什么?又为什么呢?

我错过了代码中的某些东西,在c ++中函数返回指针的规则是什么?

Python中在单独的线程中调用同一函数的最佳方法是什么?

当我在C / C ++中调用recvfrom()函数时,读取逻辑是什么?

python代码中的“ ModLoad”是什么?

python中的代码块是什么?

C ++中的代码是什么意思?

C#中的源代码是什么?

python中的对象调用是什么?

C代码:主程序中的调用函数

从两个离散函数中获得最大收益的最短的Python代码是什么?

在python函数调用中混合关键字参数和*元组的规则是什么

在多次调用同一函数的过程中重用数据的最Python方法是什么?

从python库中调用用户定义函数的一些好方法是什么?

从C调用python函数作为回调。处理GIL的正确方法是什么?

用C ++处理框架以从脚本中调用不同类型的函数的方式是什么?