python - Cython + ctypes?

标签 python ctypes cython pysdl2

我们目前正在使用 Cython 来绑定(bind)一些网络和数据库库。我们还想使用 SDL,但是 PySDL2 使用 ctypes 进行绑定(bind)。 Cython 是完整的解释器,ctypes 只是库。但是,Cythonctypes 通常被描绘成彼此的替代品。因此我完全不确定它们是否兼容。

所以,问题:是否可以在一个项目中同时使用 Cythonctypes

最佳答案

下面简要总结了这两种工具的工作原理:

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

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

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

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

关于python - Cython + ctypes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18785825/

相关文章:

python - 按 dict.values 的数值对字典进行排序

python - 将 array.array 的内容放入堆中

python - 为 python 包装 c++ 类(使用 opencv),给出错误

python - 我可以使用 Tkinter 创建 Tcl 交互式 shell 吗?

python - 简化语句 '.' .join( string.split ('.' )[0 :3] )

scipy - 是否可以将 cython 函数作为参数传递给 scipy 函数?

class - Cython:我可以使用 cppclass 而不是 class 吗?它有任何性能优势吗?

python - 出现错误 “FindContours support only 8uC1 and 32sC1 images in function cvStartFindContours”

python - window Python : Changing encoding using the locale module

python - 如何将 SqlAlchemy 结果序列化为 JSON?