我们目前正在使用Cython绑定到一些网络和DB库。我们也想使用SDL,但是PySDL2使用ctypes进行绑定。Cython是一个完整的解释器,而ctypes只是一个库。但是,Cython和ctypes通常被描述为彼此的替代品。因此,我完全不确定它们是否兼容。
那么,问题是:在一个项目中同时使用Cython和ctypes是可能的吗?
发布于 2013-09-29 03:55:40
以下是这两个工具的工作原理的简要总结:
ctypes是一个名为cffi的库上的一个非常具有pythonic风格的包装器,它能够加载共享库(.so或.dll文件)并调用它们,而无需首先编译任何代码来包装这些库中定义的函数。您必须告诉ctype它将调用的函数,以便它可以从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,那么你可以直接在代码中包含libsdl声明,以避免从低级C类型转换到python类型的开销,只是为了让ctypes再次将它们转换回来。您可以将其推迟,直到您的应用程序增长了一点,并且您发现了一些性能瓶颈。
https://stackoverflow.com/questions/18785825
复制相似问题