Cython + ctypes?

Sha*_*ain 3 python ctypes cython pysdl2

我们目前正在使用Cython绑定到一些网络和数据库库.我们希望也用SDL,但PySDL2使用ctypes的绑定.虽然Cython是整个翻译,但ctypes只是图书馆.但是,Cython并且ctypes通常被描述为彼此的替代品.因此,我完全不确定它们是否兼容.

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

Sin*_*ion 5

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

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

Cython是C语言翻译的"蟒蛇".生成的C代码可以编译,结果是一种特殊的共享库(.so或.dll再次),它具有所有正确的函数作为Python C扩展.Cython非常聪明,基于输入中的类型注释,它知道是否发出直接调用C函数的代码(当你使用时cdef)或通过PyObject_CallC api 调用常规python对象.

既然你可以(或多或少)在Cython源代码中自由地混合使用C和python,你就可以毫无困难地在你的Cython库中使用PySDL2,只需调用它就好像是普通的python,导入它,调用它,一切都应该"正常工作" ".

也就是说,你可能会libsdl直接在代码中包含声明,如果你最终从紧密的内部循环调用SDL,以避免从低级C类型转换为python类型的开销,只是为了ctypes将它们转换回来再次.您可以将其关闭,直到您的应用程序增长一点,并且您发现一些性能瓶颈.