我们目前正在使用 Cython
与一些网络和数据库库进行绑定。我们也想使用 SDL
,但PySDL2
使用 ctypes
进行绑定。虽然Cython
是完整的解释器,但ctypes
只是图书馆。但是,Cython
和ctypes
最常被描绘成彼此的替代品。因此,我完全不确定它们是否兼容。
那么,问题:是否可以在一个项目中同时使用Cython
和ctypes
?
以下是这两个工具如何工作的简要摘要:
ctypes 是一个非常 pythonic 的包装器,它位于一个名为 cffi
的库上,它能够加载共享库(.so
或.dll
文件)并调用它们,而无需首先编译任何代码来包装这些库中定义的函数。 你必须告诉 ctypes 它将调用的函数,以便它可以从 python 类型(int
、str
等)转换为共享库中表示的 abi(uint32_t
、char *
等)。
Cython是C翻译的"一种python"。 生成的C代码可以被编译,结果是一种特殊的共享库(.so
或再次.dll
),它具有成为Python C扩展的所有正确功能。 Cython 非常聪明,根据输入中的类型标注,它知道是发出直接调用 C 函数的代码(当你使用 cdef
时),还是通过 PyObject_Call
C API 的方式调用常规的 python 对象。
由于您可以(或多或少)在 Cython 源代码中自由混合 C 和 python,因此在 Cython 库中使用 PySDL2 应该没有困难,只需像调用常规 python 一样调用它,导入它,调用它,一切都应该"正常工作"。
也就是说,如果您最终从紧密的内部循环调用 SDL,则可以直接在代码中包含libsdl
声明中受益,以避免从低级 C 类型转换为 python 类型的开销,只是为了让ctypes
将它们重新转换回来。 您可能会推迟它,直到您的应用程序增长一点并且您注意到一些性能瓶颈。