python调用dll

1.整理python调用dll的方法
python调用dll的话 根据之前查到的资料看上去应该是很简单的

加载DLL

from ctypes import *
dll = CDLL(“add.dll”)
print dll.Add(1, 102) —调用dll中的函数

CDLL(“add.dll”) 是调用符合cdecl调用约定函数的加载DLL方式

2.vs生成简单的dll并使用python调用dll中的函数(函数参数分别为基本类型,指针,对象)

2.1 创建32位python虚拟环境
vs生成的dll为32位,而一般python都是64位,在prompt中切换成32位(set CONDA_FORCE_32BIT=1),再创建一个python虚拟环境,然后在pycharm中引入这个环境就可以了;

2.2 32位的第三方库的安装
激活虚拟环境后,再执行一次set CONDA_FORCE_32BIT=1,经测试直接用conda/pip install安装的还是64位的库,需要到pypi上下载32位的库的安装包然后安装,不然会报错;

python调用dll中的函数:https://blog.csdn.net/weixin_38285131/article/details/81288338
dll生成:https://blog.csdn.net/u013263891/article/details/83025639
dll生成前需要定义一个宏#define DLLEXPORT extern “C” __declspec(dllexport),然后在每个需要在python中调用的函数的定义前把宏加上DLLEXPORT int sum(int a, int b)

实战:
1.python引入xxx.dll,并调用函数
由于xxx.dll依赖其他dll,经测试需要将aaa.dll放在与python.exe同一个文件夹下(D:\Anaconda\envs\python32);在python下读取测试图片灰度图,并reshape成1维向量,使用in_img_temp=(ctypes.c_uint8*len(in_img))(*in_img)将numpy数组转化为ctypes数组(*in_img_temp获取ctypes数组值),传入dll.func(in_img_temp,out_img_temp)得到处理后的图片的一维向量;

代码如下:

n_img=cv2.imread('...\\test.bmp',0)

dll=ctypes.CDLL('...\\test.dll')

dll.funcSetImageSize(512,640)
dll.funcSetOptimizationLevel(9)
dll.funcInit()

out_img=np.uint8(np.zeros((512*640)))
in_img=in_img.reshape(512*640)
out_img_temp=(ctypes.c_uint8*len(out_img))(*out_img)
in_img_temp=(ctypes.c_uint8*len(in_img))(*in_img)
dll.func(in_img_temp,out_img_temp)

output=np.array([*out_img_temp]).reshape(512,640)
cv2.imwrite('...\\test.jpg',output)

你可能感兴趣的:(python调用dll)