目录
- 前言:
- 配置环境:
- 基础夯实(对于ctypes的介绍):
- 1. 加载共享库
- 2. 定义函数原型
- 3. 调用函数
- 4. 处理数据结构
- 5. 处理指针
- 6. 错误处理
- 7. 使用 `ctypes.util`
- 总结
- 效果展示:
- 操作步骤(保姆级教学)
- 一在VS中创建dll文件:
- 首先打开vs
- 创建新项目
- 选择c++的空项目
- 配置新项目
- 选择新建项
- 二在VScode中使用python调用dll文件:
- vscode创建python文件
- 导入代码:
- 从终端查看结果
- 参考资料:
前言:
最近和一位前辈聊天,说到使用python来调用c++动态链接库来解决问题,可以增加产品的性能,所以尝试学习这个技术,后面还会尝试使用c++来调用python库,实现不同语言的交叉使用。欢迎大家交流学习。
配置环境:
在VS中生成c++动态连接库,也就是dll,在vscode中使用python语言进行调用:
基础夯实(对于ctypes的介绍):
ctypes
是 Python 的一个外部库,用于调用存储在共享库(如 C 或 C++ 库)中的函数,以及处理 C 数据结构。它提供了一种简单的方式来从 Python 代码中访问 C 代码的功能。下面是一些基本的 ctypes
用法示例:
1. 加载共享库
首先,你需要加载一个共享库(例如 .dll
、.so
、.dylib
文件)。ctypes
提供了 CDLL
和 WinDLL
来加载不同平台的库。
-
对于 Linux/macOS:
import ctypes lib = ctypes.CDLL("/path/to/your/library.so")
-
对于 Windows:
import ctypes lib = ctypes.WinDLL("/path/to/your/library.dll")
或者,如果库位于系统的标准库路径中,你可以直接加载库名:
import ctypes
lib = ctypes.CDLL("yourlibrary")
2. 定义函数原型
加载库之后,你需要为将要调用的函数定义原型。这包括函数的返回类型和参数类型。
例如,如果你的 C 库中有一个函数如下:
int add(int a, int b);
你可以在 Python 中这样定义它:
import ctypes
# 加载库
lib = ctypes.CDLL("yourlibrary")
# 定义函数原型
lib.add.argtypes = [ctypes.c_int, ctypes.c_int]
lib.add.restype = ctypes.c_int
3. 调用函数
定义了函数原型之后,你就可以从 Python 中调用这个函数了:
result = lib.add(2, 3)
print(result) # 输出: 5
4. 处理数据结构
ctypes
也支持定义和使用 C 风格的数据结构。例如,对于下面的 C 结构体:
struct Point {
int x;
int y;
};
你可以在 Python 中这样定义:
import ctypes
class Point(ctypes.Structure):
_fields_ = [("x", ctypes.c_int),
("y", ctypes.c_int)]
# 创建实例
point = Point(x=10, y=20)
print(point.x, point.y) # 输出: 10 20
5. 处理指针
ctypes
同样支持指针操作。例如,要创建一个指向整数的指针:
import ctypes
int_pointer = ctypes.pointer(ctypes.c_int(5))
print(int_pointer.contents.value) # 输出: 5
6. 错误处理
当调用外部函数时,可能会遇到各种错误。ctypes
允许你检查错误码或者捕获异常来处理这些情况。例如,对于 C 库函数返回的错误码,你可以根据需要进行处理。
7. 使用 ctypes.util
ctypes.util
提供了一些实用工具,如 find_library
函数,它可以帮助你查找系统中安装的库:
import ctypes.util
lib_name = ctypes.util.find_library("yourlibraryname")
if lib_name:
lib = ctypes.CDLL(lib_name)
else:
raise ImportError("Library not found")
总结
ctypes
是一个功能强大的工具,它允许你在 Python 中使用 C 代码。通过定义函数原型、处理数据结构和指针,以及进行错误处理,你可以将 Python 的易用性和 C 的性能结合起来。不过,对于复杂的 C++ 代码,ctypes
可能不够直观,此时你可能需要考虑使用 cffi
、SWIG
或其他工具。
效果展示:
操作步骤(保姆级教学)
一在VS中创建dll文件:
首先打开vs
创建新项目
选择c++的空项目
注意类型不要选错了
配置新项目
选择新建项
代码:
#include "pch.h"
#define DLLEXPORT extern "C" __declspec(dllexport)
//两数相加
DLLEXPORT int sum(int a, int b) {
return a + b;
}
如果没有生成成功,看一下是不是dll配置有问题。
二在VScode中使用python调用dll文件:
vscode创建python文件
这个配置文件没什么好说的,直接创建一个文件夹,然后使用vscode打开,创建一个以py结尾的文件即可:
导入代码:
from ctypes import *
//参考我的路径写法pDll = CDLL("C:\\Users\\wangningning\\source\\repos\\Dll3\\x64\\Debug\\Dll3.dll")
pDll = CDLL("你的dll路径")
#调用动态链接库函数
res = pDll.sum(15,20)
#打印返回结果
print(res)
从终端查看结果
如果结果一样,恭喜你,成功使用python调用了c++动态链接库。
参考资料:
参考资料