我们目前正在使用Cython将一些网络和数据库库进行绑定。我们也想使用SDL,但PySDL2使用ctypes进行绑定。虽然Cython是整个解释器,而ctypes只是库。但是,Cython和ctypes通常被描述为彼此的替代品。因此,我完全不确定它们是否兼容。问题是:在一个项目中可以同时使用Cython和ctypes吗?
以下是两个工具的简要概述:ctypes是一个非常Pythonic的包装器,可以在不编译任何代码以包装共享库中定义的函数的情况下,加载共享库(.so或.dll文件)并调用它们。您需要告诉ctypes将要调用哪些函数,以便它可以从Python类型(int、str等)转换为共享库中表示的abi(uint32_t、char *等)。Cython是一种“类似于Python”的C翻译器。生成的C代码可以编译,结果是一种特殊的共享库(再次是.so或.dll),具有所有正确的函数成为Python C扩展。根据输入中的类型注释,Cython非常智能,知道是否发出直接调用C函数的代码(当使用cdef时)或通过PyObject_Call C API调用常规Python对象。由于您可以在Cython源中自由地混合C和Python,因此在您的Cython库中使用PySDL2不应有困难,只需按照常规Python导入它,调用它,一切都应该“正常工作”。话虽如此,如果您最终从紧密内部循环调用SDL来避免从低级C类型转换为Python类型,然后再由ctypes将它们转换回来的开销,则可能受益于直接在代码中包括libsdl声明。您可能可以推迟这一点,直到您的应用程序增长并且您注意到某些性能瓶颈。