我们目前正在使用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 一样调用它,导入它,调用它,一切都应该“正常工作”。
也就是说libsdl
,如果您最终从紧密的内部循环中调用 SDL,以避免从低级 C 类型转换为 python 类型的开销,只需ctypes
将它们转换回来,您可能会直接受益于在代码中包含声明再次。您可能会推迟它,直到您的应用程序有所增长并且您注意到一些性能瓶颈。