Cython + ctypes?

3
我们目前正在使用Cython将一些网络和数据库库进行绑定。我们也想使用SDL,但PySDL2使用ctypes进行绑定。虽然Cython是整个解释器,而ctypes只是库。但是,Cython和ctypes通常被描述为彼此的替代品。因此,我完全不确定它们是否兼容。
问题是:在一个项目中可以同时使用Cython和ctypes吗?

是的,它们不会相互干扰。 Cython 编译成普通的 Python 模块,因此您可以将其与任何库一起使用。 - Czarek Tomczak
1个回答

5
以下是两个工具的简要概述:
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声明。您可能可以推迟这一点,直到您的应用程序增长并且您注意到某些性能瓶颈。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接