📅  最后修改于: 2023-12-03 14:46:12.552000             🧑  作者: Mango
在Python中调用DLL可大大扩展Python的功能。Python中有很多方式使用DLL,这里介绍两种方式:ctypes和cffi。
ctypes是Python标准库中的模块,提供了一种调用C/C++函数库的方法。以下演示如何使用ctypes调用DLL中的函数。
import ctypes
# 加载DLL
mydll = ctypes.WinDLL('mydll.dll')
# 调用函数
mydll.my_function()
在WinDLL
中传入DLL的名称及路径可加载一个DLL。my_function()
是DLL中的一个函数名。调用之前,需要知道函数接受的参数和返回值的类型。
以下是一个接受整数参数和返回整数的函数的示例:
// mydll.c
int my_function(int arg1, int arg2)
{
return arg1 + arg2;
}
import ctypes
# 加载DLL
mydll = ctypes.WinDLL('mydll.dll')
# 设置函数返回类型
mydll.my_function.restype = ctypes.c_int
# 调用函数
result = mydll.my_function(1, 2)
print(result) # 输出3
在调用函数之前,需要设置函数的返回类型和每个参数的类型。
cffi是一个比ctypes更高级的外部函数调用库。它可以自动生成C函数的Python包装器。以下演示如何使用cffi调用DLL中的函数。
import cffi
# 创建FFI对象
ffi = cffi.FFI()
# 加载头文件
with open('mydll.h') as f:
header = f.read()
# 加载库文件
lib = ffi.dlopen('mydll.dll')
# 设置返回值和参数的类型
ffi.cdef(header)
# 调用函数
result = lib.my_function(1, 2)
print(result) # 输出3
在使用cffi时,需要提前准备好C头文件,可以使用它生成Python包装器。其中,dlopen
用于加载库文件,cdef
用于设置头文件中定义的函数和类型。在调用函数时,可以直接使用函数名即可。cffi会自动转换C和Python之间的参数和返回值类型。
两种方式都非常易用,但是ctypes不支持C++类的调用,而cffi可以支持,但需要提供头文件,相对略微复杂一些。视情况选择使用即可。