📜  python 使用 dll - Python (1)

📅  最后修改于: 2023-12-03 14:46:12.552000             🧑  作者: Mango

使用Python调用DLL

在Python中调用DLL可大大扩展Python的功能。Python中有很多方式使用DLL,这里介绍两种方式:ctypes和cffi。

ctypes

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

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可以支持,但需要提供头文件,相对略微复杂一些。视情况选择使用即可。