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