python中用ctypes调用dll访问numpy的数据

背景

要在python中调用c或者c++写的dll是我们在实际应用中常常会遇到的情况。
参考文章:ctypes的运用(把一个numpy数组传入c中)

c的dll程序

dll程序分(__fastcall,__cdecl,__stdcall)几种,我用的是在vs环境下的__cdecl,这方面的基础知识请自行百度,先看dll的代码:

h文件

// 因为给python测试,默认不给c\c++程序调用,所以直接写__declspec(dllexport),
// 如果要给c\c++调用,需要自己定义宏决定__declspec(dllexport)是导入还是导出
#include <windows.h>
extern "C"
{
	__declspec(dllexport) int __cdecl testNumpy(uint16*	pAOData, int len);
	__declspec(dllexport) int __cdecl testNumpy_plus(uint16* pAOData, int len);
};	

cpp文件

#include "dxx.h"
// 最简单的显示出宿主程序发过来的数据
__declspec(dllexport) int __cdecl testNumpy(uint16*	pAOData, int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%d\t", pAOData[i]);
	}
	return 0;
}
// 修改宿主程序发过来的数据
__declspec(dllexport) int __cdecl testNumpy_plus(uint16*	pAOData, int len)
{
	for(int i=0;i<len;i++)
	{
		pAOData[i]++;
	}
	return 0;
}

OK,编译生成dll。

python调用dll

引用numpy对象的数据矩阵指针,从而得到数据,并进行修改。

import ctypes
import win32api
import numpy as np
# --------------------------------------------------------------------------------------
# 通过指针,在DLL中得到numpy矩阵的数据
print('step 1')
# 载入动态库
dll = ctypes.cdll.LoadLibrary("./D0x/x64/Release/D0x.dll")
# 注意要指定数据类型,一定要一致
m = np.linspace(1, 100, 100, dtype='uint16')
l = len(m)
# 这就是得到numpy数据矩阵的指针
dataptr = m.ctypes.data_as(ctypes.c_char_p)
# 调用自定义函数,送入指针及数据长度
dll.testNumpy(dataptr, l)
win32api.FreeLibrary(dll._handle)
print('\nend. step1')

结果,显示所有数据,正确。
在这里插入图片描述
这是修改的测试

import ctypes
import win32api
import numpy as np
# --------------------------------------------------------------------------------------
# 通过指针,在DLL中修改/返回数据到numpy中
print('step 2')
dll = ctypes.cdll.LoadLibrary("./D0x/x64/Release/D0x.dll")
m = np.linspace(1, 100, 100, dtype='uint16')
l = len(m)
dataptr = m.ctypes.data_as(ctypes.c_char_p)
# 测试修改数据
dll.testNumpy_plus(dataptr, l)
win32api.FreeLibrary(dll._handle)
print(m)
print('end. step2')

在这里插入图片描述
测试结果正确!

the end.

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页