3

我们目前正在使用Cython绑定到一些网络和数据库库。我们也想使用SDL,但PySDL2用于ctypes绑定。虽然Cython是整个解释器,但ctypes只是库。但是,Cython并且ctypes最常被描绘为彼此的替代品。因此,我完全不确定它们是否兼容。

所以,问题:可以在一个项目中使用Cython和一起使用吗?ctypes

4

1 回答 1

5

以下是这两种工具如何工作的简要总结:

ctypes 是一个非常pythonic 的对名为 的库的包装器cffi,它能够加载共享库(.so.dll文件)并调用它们,而无需首先编译任何代码来包装这些库中定义的函数。你必须告诉 ctypes 它将调用的函数,以便它可以从 python 类型(int、等)转换为共享库( 、str等)中表达的 abi 。uint32_tchar *

Cython 是 C 翻译器的“某种 python”。生成的 C 代码可以编译,结果是一种特殊类型的共享库(.so.dll再次),它具有作为 Python C 扩展的所有正确功能。Cython 非常聪明,根据输入中的类型注释,它知道是发出直接调用 C 函数(当你使用 时cdef)的代码还是通过PyObject_CallC api 调用常规 python 对象的代码。

由于您可以(或多或少)在 Cython 源代码中自由混合 C 和 python,因此在 Cython 库中使用 PySDL2 应该没有困难,只需像普通 python 一样调用它,导入它,调用它,一切都应该“正常工作”。

也就是说libsdl,如果您最终从紧密的内部循环中调用 SDL,以避免从低级 C 类型转换为 python 类型的开销,只需ctypes将它们转换回来,您可能会直接受益于在代码中包含声明再次。您可能会推迟它,直到您的应用程序有所增长并且您注意到一些性能瓶颈。

于 2013-09-28T19:55:39.517 回答