Python通过ctypes调用DLL

python ctypes 调用 dll动态库小结 搞了半天,终于调用成功了,顺利把cpp文件编译成可被ctypes调用的dll文件,顺利在python中执行了dll里的函数。之前对windows的dll完全不熟悉,只知道它是windows的动态库文件,借着这次机会也稍微把它熟悉了一下。 第一:生成可被调用的dll文件 刚开始想使用cygwin生成dll文件,可是生成的dll文件每次在python中报”[153]不是有效的win32“错误,上网 阅读详情

例程:Python通过ctypes调用DLL

此例程主要是用来备忘备查,记录一些常用的ctypes调用方式,包括:基本数据类型、指针、引用、数组、结构、类的书写方式。

ctypes官方资料

https://docs.python.org/3/library/ctypes.html

参考代码

C++代码

// PythonDll.cpp : Defines the exported functions for the DLL application.
//


#include "stdafx.h"
#include <stdio.h>
#include <opencv2/opencv.hpp>

#define _CRT_SECURE_NO_WARNINGS 
#define  _CRT_SECURE_NO_WARNINGS_GLOBALS
#pragma warning (disable: 4996)

using namespace std;
using namespace cv;

#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT int add(int a, int b);
int add(int a, int b)
{
	return a + b - 1;
}

DLLEXPORT char * sadd(char * a, char * b);
char * sadd(char * a, char * b)
{
	char c[1024];
	memset(c, 0, 1024);
	strcpy(c, a);
	char *p = (char *)(c + strlen(a));
	strcpy(p, b);
	return (char *)c;
}



DLLEXPORT void * imageResize(void * image, int h0, int w0, int channels, void * &dst, int h1, int w1, int inter = INTER_AREA)
{
	Size sz0(w0, h0);
	Size sz1(w1, h1);

	int type = CV_8UC1;
	if (channels == 3)
		type = CV_8UC3;

	Mat img(sz0, type, image);

	/*
		uchar* pxvec = img.ptr<uchar>(0);
		int count = 0;
		for (int row = 0; row < h0; row++)
		{
			pxvec = img.ptr<uchar>(row);

			for (int col = 0; col < w0 * channels; col++)
			{
					pxvec[col] = ((uchar *)image)[count++];
			}
		}
	*/

	imwrite("n1.jpg", img);
	Mat oa;
	resize(img, oa, sz1, inter);
	imwrite("n2.jpg", img);
	dst = (void *)malloc(sizeof(uint8_t)*h1*w1*channels);
	memcpy(dst, oa.data, sizeof(uint8_t)*h1*w1*channels);
	return dst;
}

DLLEXPORT void imageReizeRelease(void * data) {
	free(data);
}

typedef struct tagPerson {
	char name[20];
	char *nickname;
	char sex;
	float  height;
	int age;
} Person;

class BaseBox {
public:
	uint32_t  boxsize = 0;
	uint32_t  boxtype = 0;
};

DLLEXPORT int setPersonBox(Person p0, BaseBox bb0, Person &p1, BaseBox &bb1) {
	strcpy(p1.name, "bob baby");
	bb1.boxsize = 5;
	return 10;
}

Python代码

from ctypes import *
import numpy as np
import cv2
import os

dllpath = os.getcwd() + "/PythonDll.dll"
fd = cdll.LoadLibrary(dllpath)

x = fd.add(3, 2)

sadd = fd.sadd
sadd.argtypes = [c_char_p, c_char_p]
sadd.restype = c_char_p
# arg0 = bytes("Sam", "gbk")
# arg1 = bytes(" Sha", "gbk")
y = sadd("Sam Sha".encode("utf-8"), " ,Hello!".encode("utf-8"))
print(y.decode())

imageResize = fd.imageResize
imageReizeRelease = fd.imageReizeRelease

img1 = cv2.imread("dlrb.jpg")

h0, w0, channels = img1.shape[0:3]
print("height: {} , width: {}, channels: {}".format(h0, w0, channels))
h1 = (int)(h0 * 0.3)
w1 = (int)(w0 * 0.3)

arg1 = np.array(img1, dtype=np.uint8)
arg1 = arg1.ctypes.data_as(c_void_p)

# arg1 = img1.ctypes.data_as(c_void_p)

arg2 = pointer(c_uint8(0))
imageResize.restype = POINTER(c_uint8)
pointer = imageResize(arg1, h0, w0, channels, byref(arg2), h1, w1)
# array = np.array(np.fromiter(pointer, dtype=np.uint8, count=h1 * w1 * channels))
array = np.array(np.fromiter(arg2, dtype=np.uint8, count=h1 * w1 * channels))
img2 = array.reshape((h1, w1, channels))
cv2.imwrite("n.jpg", img2)
cv2.imshow("img2", img2)

imageReizeRelease(pointer)


CharArrayType = c_char * 20

class Person(Structure):
    _fields_ = [("name", CharArrayType),("nickname",c_char_p),("sex", c_char),("height", c_float),("age", c_int)]

class BaseBox(Structure):
    _fields_ = [("boxsize", c_int),("boxtype", c_int)]

setPersonBox = fd.setPersonBox
p0 = Person("sam".encode("utf-8"),"sam sha".encode("utf-8"),b'm',178.0,48)
bb0 = BaseBox(3,4)
p1 = Person("bob".encode("utf-8"),"bob sha".encode("utf-8"),b'm',188.0,22)
bb1 = BaseBox(7,8)
v = setPersonBox(p0,bb0,byref(p1),byref(bb1))

cv2.waitKey()
cv2.destroyAllWindows()

经验分享

VC调试DLL的设置

打开VC项目的Properties,配置Debugging的Command指向python.exe,Command Arguments指向demo.py,如果必要设置Working Directory。

python中用ctypes调用dll访问numpy的数据 背景 要在python中调用c或者c++写的dll是我们在实际应用中常常会遇到的情况。 c的dll程序 dll程序分两种(__cdecl,__stdcall),我用的是在vs环境下的__cdecl,这方面的基础知识请自行百度,先看dll的代码: h文件 // 因为给python测试,默认不给c\c++程序调用,所以直接写__declspec(dllexport), // 如果要给c\c++调用,需... 阅读详情

相关推荐

Python中通过ctypes调用C语言编写的DLL教程

ctypes是Python标准库的一部分,它提供与C语言兼容的数据类型,并允许调用动态链接库(DLLs)或共享库(在Unix系统中)中的函数。ctypes库的主要作用是为Python提供了一种接口,通过这个接口可以直接调用C语言写的代码,从而实现Python与C语言的交互。通过使用ctypes库,Python程序员可以不必重新编写C语言代码,也不用担心底层的内存管理问题,即可利用C语言编写的功能,提高Python代码执行的效率。

weixin_35755640的博客 1362

python 禁用网卡_在C++程序中开启和禁用Windows设备的无线网卡的方法

1.列出当前网卡:SetupDiEnumDeviceInfo2.找出当前无线网卡的名字(用natvie wifi api)3.卸载\安装此驱动问题:log为:SetupDiSetClassInstallParams failed. -536870347完整代码如下:// ControlWirelessCard.cpp : Defines the entry point for the consol...

weixin_39691055的博客 594

C与Python互操作性教程:ctypes和DLL调用实践

ctypes是Python标准库的一部分,提供了一系列的C语言兼容的数据类型,并且允许Python代码调用动态链接库中的函数。这在需要利用已经存在的C/C++库来优化Python程序性能时尤其有用。

weixin_30978239的博客 1320

VC++实现启用与停用设备

前些日子在研究USB设备,就顺便研究了一些如何在应用程序实现USB设备的启用与停用,然后稍微深入,于是有了本文。想要实现类似设备管理器的功能,其实也不是很难,无非就是调用一些API函数,就像本文描述的,采用的API函数就是SetupDi系列的函数。不过这类函数有很多,具体的请参见MSDN,而实现设备启用、停用仅需要用到的就只有5个函数:       SetupDiGetClassDevs   

jiangdf的专栏 7001

LT9611EX芯片实战:如何用双端口MIPI转HDMI1.4打造高清播放器(附配置代码)

本文详细介绍了如何使用龙迅半导体的LT9611EX芯片实现双端口MIPI转HDMI1.4的高清播放器开发。内容涵盖芯片特性、硬件设计要点、寄存器配置技巧及完整代码实现,特别适合嵌入式视频处理应用,如机顶盒和便携式媒体播放器。

weixin_29256771的博客 322

k8s重装1.28.2+calico+踩坑收集+InPlacePodVerticalScaling

它提供了从镜像构建(通过 Dockerfile)、镜像管理(上传、下载、存储等)、容器创建、运行、网络配置(可以为容器分配自定义的网络,如 bridge 网络、host 网络等)到容器编排(通过 Docker Compose 可以简单地编排多个容器的启动和关联关系)等一整套完整的解决方案。它的核心功能是启动和管理容器的生命周期。sudo apt update这个可以经常用,是来更新软件包的,它不下载,所以没风险,但是经常会报错,别问,问就是某种强大的力量,所以用镜像或者代理或者巴拉巴拉。

SsjjsS2019的博客 2553

Python调用DLL动态链接库——ctypes使用

最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用。 ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调用函数。 一、Python调用DLL里面的导出函数 1.VS生成dll 1.1 新建动态链接库项目 1.2 在myTest.cpp中输入以下内容: // myTest.c...

weixin_30740581的博客 2405

我想自己组装一台服务器,微调大模型通义千问2.5 Omni 72B,但是我是个人购买,资金非常有限,最省的方案

阶段动作✅ 推理用 GGUF + llama.cpp + 4090 加载 14B INT4✅ 微调训练 Qwen2.5-7B-Chat,使用 LoRA / QLoRA❌ 放弃Qwen2.5-Omni-72B 全量微调(显存需求 >160G,不现实)

AngelCryToo的专栏 2829

Python:使用ctypes库调用外部DLL

前言 朋友的公司是做GPS的,上周联系到我要帮做个程序把他们平台的车辆定位跟踪数据和省里的平台对接。看一下官方提供的三个文档,洋洋洒洒共一百多页,一大堆协议的定义甚是齐全,好在官方的文件中也带有个封装好通信功能的DLL和一个调用此接口的c++ DEMO程序,既然有现成的可用,那就不必去看他的协议了。 说实话,参加工作之后就基本没用过c++,生疏了。特别是要用c++操作数据库,对我来说比割几刀还...

weixin_33853794的博客 560

统信UOS开发环境支持Java

集成了JDK和多种IDE,为开发者提供了从代码编写、编译、调试到部署的一站式开发解决方案。

RZer的博客 2256

430单片机实现三人投票表决器_基于单片机的五人表决器的设计

姚海云+马野摘要:本设计利用51单片机,按键开关模块,数码管显示模块和LED模块来实现一个简单的五人表决器的功能。按键开关模块中的键2~键6表示五个人,由5个人来投票,当同意的票数大于或者等于3人时,数码管显示同意的人数,说明表决通过。当表决的人数小于3时,数码管显示同意的人数。关键词:表决器;单片机;流水灯;数码管;矩阵键盘;时钟中图分类号:TP391 文献标识码:A 文章编号:1009-304...

weixin_33277215的博客 2558

Python调用windows下DLL详解 - ctypes库的使用

作者:童磊(magictong)P.S. 之前的排版乱掉了,这里做一下排版,顺便改一下里面的一些用词错误。2011-08-04   在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分数据的交互。使用python中的ctypes模块可以很方便的调用windows的dll(也包括linux下的so等文件),下面将详细的讲解这个模块(以windows平

magictong的专栏 12万+

构建家庭NAS之三:在TrueNAS SCALE上安装qBittorrent

以qBittorrent为例,说明如何在TrueNAS SCALE上使用docker来安装应用。

luoqingyong的博客 7006

python使用ctypes调用C编译dll函数方法

文章目录1 生成被调用的C dll1.1 C文件编译为C动态链接库1.2 用于外部引用的C函数声明1.2.1 声明用于作为dll符号给外部调用1.2.2 C函数的调用规定2 ctypes加载dll库接口3 ctypes调用C函数参数传递3.1 出参为指针3.2 入参为字符串3.4 入/出参为结构体 1 生成被调用的C dll 1.1 C文件编译为C动态链接库 在windows下,需要配置visu...

cheng3100的博客 5473

Xilinx_JESD204B

Xilinx_JESD204B_AXI配置 说明:通过FPGA的高速数据接口JESD204B对AD9625进行高速采集。 环境:Vivado2018.3。 IP核:JESD204(7.2)。 参考手册:pg066_jesd204 v7.2。 资料以及IP_licence:JESD204B AXI协议资料:AXI 文章目录JESD204B概述JESD204B接口术语JESD204B 层JESD204B_AXI介绍AXI介绍JESD204B__AXI_Lite接口AXI-Lite接口介绍AXI-Lite接口信号

Crazzy_M的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

python ctypes 调用 dll

python ctypes 调用 c++ 生成的 dll。及 visual studio 下容易出现的问题。

ShaoPPP的博客 840

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

python ctypes 详解_Python调用windows下DLL详解 - ctypes库的使用-Go语言中文社区

在python中某些时候需要C做效率上的补充,在实际应用中,需要做部分数据的交互。使用python中的ctypes模块可以很方便的调用windows的dll(也包括linux下的so等文件),下面将详细的讲解这个模块(以windows平台为例子),当然我假设你们已经对windows下怎么写一个DLL是没有问题的。引入ctypes库fromctypesimport*假设你已经有了一个的DLL(名字是...

weixin_39940755的博客 796

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python安装ctypes库_Python使用ctypes库调用外部DLL

Python:使用ctypes库调用外部DLL一、Python之ctypesctypes是Python的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用CDLL中的函数。在Python2.5官方安装包都带有ctypes1.1版。ctypes的官方文档在这里。ctypes的使用非常简明,如调用cdecl方式的DLL只需这样:viewsourceprint?1fromctypesi...

weixin_39860849的博客 1797

【python 调用DLL库】python使用ctypes库调用DLL动态链接库

python 可以调用C++的DLL 动态链接库,从而达到与c++语言交互的目的。 python调用C++编译生成的DLL动态链接库,我们需要借助ctypes库。 ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调用函数。 假如我们在外面定义了一个myTest.dll文件,计算两个数之和。 那么 我们python 如何调用DLL文件呢。 下面是具体的方法,代码也是比较少,引入ctypes包即可。 from ctypes import * # -------

赖德发的博客 1597

python调用dll函数指针_python使用ctypes库调用DLL动态链接库

最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用。ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调用函数。一、Python调用DLL里面的导出函数1.VS生成dll1.1 新建动态链接库项目1.2 在myTest.cpp中输入以下内容:// myTest.cpp : 定义 DLL 应用程序的导出函数...

weixin_39704374的博客 1080

python调用ctypes中windll中的方法超时处理_python通过ctypes调用dll

ctypes库简介python调用c等语言的方法很多如,python c api, boost.python, Swig 等等。ctypes库可以通过一种较为简单的方法,在python中直接调用dll动态链接库,且ctypes是python默认已安装的一个标准库。调用方法python中如果要通过ctypes模块调用dll,在程序开头需要导入ctypes模块 import ctypes由于调用约定的...

weixin_39817012的博客 854

Python 使用 ctypes 调用 C/C++ DLL 动态链接库

介绍如何通过ctypes模块调用 C, C++ DLL SO 动态链接库,介绍了ctypes 各种数据类型,包含字符串,指针,枚举等,如何转换 C/C++ 函数参数,特别是结构体与指针,如何转换为python格式,以将转实参传入dll 函数,获取并解析返回值, 用于调用DLL, SO动态链接库,或者 第3方SDK库,与硬件接口

Python技术探索 1万+

Python ctypes调用dll报错解决办法

Python版本64位,dll版本32位。版本不兼容。

weixin_42884500的博客 631

ironpython调用c dll_Python使用ctypes库调用外部DLL

Python:使用ctypes库调用外部DLL一、Python之ctypesctypes是Python的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用CDLL中的函数。在Python2.5官方安装包都带有ctypes1.1版。ctypes的官方文档在这里。ctypes的使用非常简明,如调用cdecl方式的DLL只需这样:viewsourceprint?1fromctypesi...

weixin_39654245的博客 281

python:使用ctypes库调用DLL

ctypes是一个用于Python的外部函数库。它提供C兼容的数据类型,并允许在DLL或共享库中调用函数。它可以用来将这些库封装在纯Python中 1.使用Visual Studio创建dll 点击完成,创建dll导出函数,下代码为C++代码 // test_dll.cpp : 定义 DLL 应用程序的导出函数。 // #include "stdafx.h" //用于...

mengxiangsun的博客 1130
下一篇: Conda Here
SamSha1971
博客等级 码龄11年 44粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值