编写扩展时如何在 Python 和 C 之间传递空指针?

jav*_*vex 6 c python cpython

我今天开始了我的第一个 Python 扩展,只是作为练习围绕 C 库创建了一个非常小的包装器。与 C 库一样,您从一个生成处理程序的初始化函数开始。您可以将该处理程序传递给函数,然后将其传递给释放内存的清理函数。

当我开始编写包装器时,我基本上希望有一种方法可以从 python 调用每个本机 C 函数。很快我就遇到了一个问题,我需要将一个任意指针从 C 返回到 Python,只是为了在另一个函数中再次将它从那里返回给 C。我不关心它的外观,因为我不在 Python 中使用它,我只是存储它并传递它。

那么如何在 Python 和 C 之间传递一个空指针呢?

请注意:我知道不建议使用扩展系统编写这么小的包装器,而是使用 ctypes 和朋友。这只是为了现在的练习。

小智 4

PyLong_FromVoidPtr() 和 PyLong_AsVoidPtr() 可能被滥用以将恶意数据注入到您的程序中。我建议反对他们。

Python 有 PyCapsule 来完成这项工作。胶囊提供了一种在模块之间或Python空间和C空间之间交换void ptr的安全方法。这些胶囊也是类型安全的。如果您需要一些示例,socket / ssl 模块和 pyexpat / _elementtree 模块使用胶囊来交换 CAPI 结构。

http://docs.python.org/3/c-api/capsule.html