Python 编程/使用 ctypes 扩展
外观
ctypes[1] 是 Python 的一个 外部函数接口 模块(包含在 Python 2.5 及更高版本中),它允许您加载动态库并调用 C 函数。从技术上讲,这并不算是扩展 Python,但它满足了扩展 Python 的主要原因之一:与外部 C 代码进行交互。
库使用 ctypes.CDLL
函数加载。加载库后,库内的函数可以直接作为常规的 Python 调用使用。例如,如果我们想放弃标准的 Python 打印语句,使用标准的 C 库函数 printf
,可以使用以下代码
from ctypes import *
libName = 'libc.so' # If you're on a UNIX-based system
libName = 'msvcrt.dll' # If you're on Windows
libc = CDLL(libName)
libc.printf("Hello, World!\n")
当然,您必须使用与您的操作系统匹配的 libName 行,并删除其他行。如果一切顺利,您应该在控制台中看到著名的 Hello World 字符串。
ctypes 默认情况下假定任何给定函数的返回类型为本机大小的有符号整数。有时您不希望函数返回任何内容,而有时您又希望函数返回其他类型。每个 ctypes 函数都有一个名为 restype
的属性。当您将 ctypes 类分配给 restype
时,它会自动将函数的返回值转换为该类型。
ctypes 名称 | C 类型 | Python 类型 | 注释 |
---|---|---|---|
None | void | None | None 对象 |
c_bool | C99 _Bool | bool | |
c_byte | signed char | int | |
c_char | signed char | str | 长度为 1 |
c_char_p | char * | str | |
c_double | double | float | |
c_float | float | float | |
c_int | signed int | int | |
c_long | signed long | long | |
c_longlong | signed long long | long | |
c_short | signed short | long | |
c_ubyte | unsigned char | int | |
c_uint | unsigned int | int | |
c_ulong | unsigned long | long | |
c_ulonglong | unsigned long long | long | |
c_ushort | unsigned short | int | |
c_void_p | void * | int | |
c_wchar | wchar_t | unicode | 长度为 1 |
c_wchar_p | wchar_t * | unicode |