ctypes[1] 是 Python 的一个外部函数接口模块(包含在 Python 2.5 及更高版本中),它允许你加载动态库并调用 C 函数。从技术上讲,这并不是扩展 Python,但它实现了扩展 Python 的主要原因之一:与外部 C 代码交互。

基础知识

使用 ctypes.CDLL 函数加载库。加载库后,库中的函数就可以像常规 Python 调用一样使用。例如,如果我们想放弃标准的 Python print 语句,而使用标准 C 库函数 printf,你可以这样使用:

Python
from ctypes import *

libName = 'libc.so'  # 如果你在基于 UNIX 的系统上
libName = 'msvcrt.dll' # 如果你在 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  
Last modified: Friday, 31 January 2025, 2:00 AM