跳转到内容

Python 编程/使用 ctypes 扩展

来自 Wikibooks,开放世界中的开放书籍


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
华夏公益教科书