当前位置: 首页 > news >正文

Python基础(①①Ctypes)

ctypes 是什么?


ctypes 是 Python 标准库自带的模块(无需额外安装),主要作用是 调用 C 语言编写的动态链接库(如 Windows 的 .dll、Linux 的 .so、macOS 的 .dylib),实现 Python 与 C 代码的交互(和 Cython 不同,ctypes 是 “直接调用现成的 C 库”,而 Cython 是 “将 Python 风格代码编译为 C 扩展”)

场景 1:调用 Windows 系统自带 DLL

user32.dll是 Windows 系统中负责窗口管理的重要 DLL,包含很多与窗口、消息框相关的功能。

 "弹出消息框"代码

import ctypes
import sysdef show_message_box():if not sys.platform.startswith('win32'):print("这个程序只能在Windows系统上运行哦!")returnuser32 = ctypes.WinDLL('user32', use_last_error=True)# 使用MessageBoxW而不是MessageBoxA,支持Unicodeuser32.MessageBoxW(None,"你好!这是用user32.dll弹出的消息框",  # 中文现在能正常显示了"消息框标题",0x00000001 | 0x00000040  # 样式不变)if __name__ == "__main__":show_message_box()print("消息框已关闭")

获取屏幕分辨率代码

import ctypes
import sysdef get_screen_resolution():if not sys.platform.startswith('win32'):print("这个程序只能在Windows系统上运行")returnuser32 = ctypes.WinDLL('user32')# 获取屏幕宽度width = user32.GetSystemMetrics(0)  # 0表示SM_CXSCREEN,屏幕宽度# 获取屏幕高度height = user32.GetSystemMetrics(1) # 1表示SM_CYSCREEN,屏幕高度print(f"屏幕分辨率: {width}x{height}")if __name__ == "__main__":get_screen_resolution()

场景 2:调用自己写的C++

步骤 1:编写 C++ 代码(生成 DLL)

首先创建一个简单的 C++ 文件(例如mydll.cpp),注意要使用__declspec(dllexport)导出函数,以便其他程序调用:

// mydll.cpp
#include <iostream>
#include <string>// 导出函数声明,extern "C" 确保函数名不被C++编译器修饰
extern "C" __declspec(dllexport) int add(int a, int b) {return a + b;
}extern "C" __declspec(dllexport) const char* get_message() {// 返回字符串时要注意:确保内存有效(这里用静态字符串)return "Hello from C++ DLL!";
}extern "C" __declspec(dllexport) void print_message(const char* msg) {std::cout << "Received: " << msg << std::endl;
}

步骤 2:打开 VS2022 的命令行工具

按下Win + S,搜索并打开 "x64 Native Tools Command Prompt for VS 2022"(这是 VS2022 的 64 位命令行工具,已配置好编译环境)

在打开的命令行工具中,切换到mydll.cpp所在的目录(例如cd D:\myproject),然后执行以下命令:

cl /LD /EHsc mydll.cpp

    /LD:指定生成 DLL(动态链接库)

    /EHsc:启用 C++ 异常处理(可选,但推荐)

    mydll.cpp:你的源代码文件

    执行成功后,会在当前目录生成 3 个文件:

    mydll.dll:我们需要的动态链接库

    mydll.lib:导入库(链接时使用,Python 调用 DLL 时不需要)

    mydll.obj:编译中间文件(可忽略)

    步骤 3:用 Python 的 ctypes 调用 DLL

    import ctypes
    import osdef call_my_dll():# 加载DLL(替换为你的DLL实际路径)dll_path = os.path.join(os.path.dirname(__file__), "mydll.dll")mydll = ctypes.CDLL(dll_path)# 1. 调用add函数(整数相加)# 设置参数和返回值类型(可选,但推荐)mydll.add.argtypes = [ctypes.c_int, ctypes.c_int]mydll.add.restype = ctypes.c_intresult = mydll.add(3, 5)print(f"3 + 5 = {result}")# 2. 调用get_message函数(获取字符串)mydll.get_message.argtypes = []mydll.get_message.restype = ctypes.c_char_p  # 表示返回C风格字符串message = mydll.get_message()print(f"从DLL获取的消息: {message.decode('utf-8')}")# 3. 调用print_message函数(传递字符串)mydll.print_message.argtypes = [ctypes.c_char_p]mydll.print_message.argtypes = [ctypes.c_char_p]mydll.print_message(b"Hello from Python!")  # 传递字节串if __name__ == "__main__":call_my_dll()
    

    123

    http://www.dtcms.com/a/365854.html

    相关文章:

  1. C 内存对齐踩坑记录
  2. 【随手记】vscode中C语言满足KR风格的方法
  3. Elasticsearch核心数据类型
  4. 深度学习——卷积神经网络
  5. AI产品经理面试宝典第84天:RAG系统架构设计与优化策略面试指南
  6. 分布式AI算力系统番外篇-----超体的现世《星核》
  7. 【Doris入门】Doris数据表模型使用指南:核心注意事项与实践
  8. 从PkiAsn1Decode函数到ASN1Dec_SignedDataWithBlobs函数
  9. 中山AI搜索优化实践:技术干货解析与金拓智能案例
  10. select, poll, epoll
  11. 【108】基于51单片机智能输液监测系统【Proteus仿真+Keil程序+报告+原理图】
  12. 详尽 | Deeplabv3+结构理解
  13. CSS中使用 HSL(Hue, Saturation, Lightness) 动态生成色值
  14. 二叉树结尾——销毁,层序遍历与判断完全二叉树
  15. python如何解决html格式不规范问题
  16. windows系统服务器测试部署springboot+vue+mysql项目
  17. 使用 Acme.sh 获取和管理免费 SSL 证书
  18. vue2头部布局示例
  19. Anaconda3出现Fatal error in launcher: Unable to create process using.....问题
  20. python 连接数据库进行文件查重(SAP版本)
  21. RoPE位置编码缩放因子的最优解:频率维度与位置敏感度的精妙权衡
  22. TypeScript:Promise的详细用法讲解
  23. 面试复习题--kotlin的设计模式
  24. shell内置命令
  25. UART更好的封装 添加容错代码
  26. Qt6用Chart模块做数据可视化?别再用老套路,看看这套35张图背后的秘密
  27. [密码学实战](GBT 15843.2-2017)Java实现基于SM4的实体鉴别机制(四十八)
  28. MinIO祭了,RustFS来了!
  29. 关于node中的一些用到的读取文件方法
  30. Dubbo3单端口多协议源码分析