Python调用C/C++ DLL:编译与使用方法详解222


Python 是一种强大的脚本语言,以其易用性和丰富的库而闻名。然而,在某些性能关键型任务或需要访问特定硬件的场景下,使用 C/C++ 编写高性能模块并将其编译成 DLL (Dynamic Link Library) 文件,然后在 Python 中调用,是一个常用的策略。本文将详细讲解如何编译 C/C++ 代码生成 DLL 文件,以及如何在 Python 中使用 `ctypes` 模块或 `cffi` 模块高效地调用这些 DLL 函数。

一、 使用C/C++编译DLL

编译 C/C++ 代码生成 DLL 的过程取决于你的操作系统和编译器。以下分别介绍 Windows 和 Linux 下的常见方法:

1. Windows (使用 Visual Studio)

Visual Studio 是 Windows 下最常用的 C/C++ 编译器。创建一个新的 DLL 项目,编写你的 C/C++ 代码。例如,创建一个名为 的文件,包含以下代码:```cpp
#include
extern "C" __declspec(dllexport) int add(int a, int b) {
return a + b;
}
extern "C" __declspec(dllexport) double multiply(double a, double b) {
return a * b;
}
```

这段代码定义了两个函数:add 和 multiply,并使用 `__declspec(dllexport)` 声明它们将被导出到 DLL。 `extern "C"` 确保函数名不被C++编译器修饰,从而方便Python调用。 编译此项目后,你将获得一个名为 的文件。

2. Linux (使用 GCC)

在 Linux 下,可以使用 GCC 编译器。创建一个名为 mydll.c 的文件,包含类似的代码:```c
#include
int add(int a, int b) {
return a + b;
}
double multiply(double a, double b) {
return a * b;
}
```

然后使用以下命令编译:```bash
gcc -shared -o -fPIC mydll.c
```

-shared 选项指定生成共享库(DLL),-fPIC 选项生成位置无关代码,这对于共享库是必要的。 生成的库文件名为 。

二、 Python 调用 DLL

Python 提供了多个模块来调用 DLL,其中最常用的是 `ctypes` 和 `cffi`。

1. 使用 `ctypes` 模块

ctypes 是 Python 的内置模块,无需额外安装。以下代码演示如何在 Python 中使用 `ctypes` 调用前面编译的 DLL:```python
import ctypes
# 加载 DLL
dll = ("./") # Windows
# dll = ("./") # Linux
# 定义函数类型
= [ctypes.c_int, ctypes.c_int]
= ctypes.c_int
= [ctypes.c_double, ctypes.c_double]
= ctypes.c_double
# 调用函数
result_add = (5, 3)
result_multiply = (2.5, 4.0)
print(f"5 + 3 = {result_add}")
print(f"2.5 * 4.0 = {result_multiply}")
```

这段代码首先加载 DLL,然后定义函数的输入和输出类型,最后调用函数并打印结果。 注意路径需要根据实际情况调整。

2. 使用 `cffi` 模块

cffi 是一个更高级的模块,它允许你使用 C 代码定义 Python 接口,并自动生成与 C 代码交互的 Python 代码。 它比 `ctypes` 更高效,也更容易处理更复杂的 C 代码。

首先安装 `cffi`:pip install cffi```python
from cffi import FFI
ffi = FFI()
("""
int add(int a, int b);
double multiply(double a, double b);
""")
lib = ("./") # Windows
# lib = ("./") # Linux
result_add = (5, 3)
result_multiply = (2.5, 4.0)
print(f"5 + 3 = {result_add}")
print(f"2.5 * 4.0 = {result_multiply}")
```

cffi 需要你提前声明函数接口,但它可以更方便地处理结构体、指针等复杂数据类型。

三、 总结

本文介绍了如何在 Windows 和 Linux 系统下编译 C/C++ 代码生成 DLL 文件,以及如何在 Python 中使用 `ctypes` 和 `cffi` 模块调用这些 DLL 函数。 选择哪种方法取决于你的项目需求和复杂度。 `ctypes` 适用于简单的场景,而 `cffi` 更适合处理更复杂的 C 代码和数据结构,并提供更好的性能。

四、 注意事项

确保你的 DLL 文件与你的 Python 解释器架构(32位或64位)匹配。 错误的匹配会导致加载 DLL 失败。 同时,正确设置环境变量和库路径也很重要,以确保 Python 能够找到 DLL 文件。 处理指针和内存管理时,需要格外小心,避免内存泄漏等问题。 对于大型项目,建议使用构建系统(如 CMake)来简化编译过程。

2025-06-19


上一篇:Python文件操作:try-except块的优雅应用与最佳实践

下一篇:在线Python代码编辑器:提升你的Python编程效率