Python调用ctypes使用C函数printf的方法


Posted in Python onAugust 23, 2017

在Python程序中导入ctypes模块,载入动态链接库。动态链接库有三种:cdll以及windows下的windll和oledll,cdll载入导出函数使用标准的cdecl调用规范的库,而windll载入导出函数符合stdcall调用规范(Win32 API的原生约定)的库,oledll也使用stdcall调用规范,并假设函数返回Windows的HRESULT错误代码。错误代码用于在出错时自动抛出WindowsError这个Python异常,可以使用COM函数得到具体的错误信息。

使用cdll.msvcrt即可调用MS标准的C库msvcrt,msvcrt包含了大部分标准C函数。

下面来看一下简单的printf函数。

from ctypes import *
msvcrt = cdll.msvcrt
str = "Huanhuan!"
msvcrt.printf("Hello %s\n", str)

这样就可以使用C语言中的printf函数进行输出。
如果在IDLE里运行的话会发现程序没有任何输出结果,这是因为printf是打印到真实的标准输出,而不是sys.stdout。如果想要看到运行结果,可以在CMD里运行python test.py来查看结果,前提是已经设置好了Python的环境变量。或者有一个曲线方法可以在IDLE中显示输出结果,请曲线阅读到文章最后。

如果使用的是Py3K,在控制台里会看到只有开头字符H被输出了。因为Py3K使用的是Unicode编码,而printf不支持该编码,所以需要转码。整理出来三种改写方法可以解决这一问题。

# A 转为byte类型 在字符串前面加b
from ctypes import *
msvcrt = cdll.msvcrt
str = b"Huanhuan!"
msvcrt.printf(b"Hello %s\n", str)

# B 使用wprintf宽字符显示
from ctypes import *
msvcrt = cdll.msvcrt
str = "Huanhuan!"
msvcrt.wprintf("Hello %s\n", str)

# C 转码为utf-8
from ctypes import *
msvcrt = cdll.msvcrt
str = "Huanhuan!"
result = "Hello " + str + "\n"
result = result.encode("utf-8")
msvcrt.printf(result)

最后来搞定在IDLE中曲线显示输出结果的方法。

from ctypes import *
msvcrt = cdll.msvcrt
str = b"Huanhuan!"
s = create_string_buffer(100)  # 必须足够长
msvcrt.sprintf(s, b'Hello %s\n', str)
print(s.value.decode('utf-8'))

先使用sprintf函数把结果输出到s变量,然后再用Python自带的print方法输出s的value。

好了,通过以上的各种方法就可以解决Py3K调用C函数printf的问题了。

什么?你问我为什么费这么大劲非要用printf输出,而不是直接用Python自带的print?

python的print和c的printf有什么区别

print([object, ...], *, sep=' ', end='\n', file=sys.stdout, flush=False)

输出对象到流文件,sep指定分割符,end指定结束符。参数转换为字符串写入输出流,如果没有输出内容直接输出end结束符。file参数必须是包含write方法的对象,默认输出到标准输出。

int printf( char * format, ... );

根据参数 format 字符串来转换并格式化数据,然后将结果输出到标准输出设备(显示器),直到出现字符串结束('\0')为止。
参数 format 字符串可包含下列三种字符类型:

一般文本,将会直接输出
ASCII 控制字符,如\t、\n 等有特定含义
格式转换字符

格式转换为一个百分比符号(%)及其后的格式字符所组成。一般而言,每个%符号在其后都必需有一个参数与之相呼应(只有当%%转换字符出现时会直接输出%字符),而欲输出的数据类型必须与其相对应的转换字符类型相同。

Python 相关文章推荐
跟老齐学Python之重回函数
Oct 10 Python
Python将xml和xsl转换为html的方法
Mar 10 Python
Python实现信用卡系统(支持购物、转账、存取钱)
Jun 24 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
利用python获取某年中每个月的第一天和最后一天
Dec 15 Python
python 多线程中子线程和主线程相互通信方法
Nov 09 Python
基于Python打造账号共享浏览器功能
May 30 Python
django的ORM操作 增加和查询
Jul 26 Python
详解如何用python实现一个简单下载器的服务端和客户端
Oct 28 Python
Python列表倒序输出及其效率详解
Mar 04 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
Mar 19 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
使用Python实现博客上进行自动翻页
Aug 23 #Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
Aug 23 #Python
Python PyQt5标准对话框用法示例
Aug 23 #Python
Python PyQt5实现的简易计算器功能示例
Aug 23 #Python
Python实现的密码强度检测器示例
Aug 23 #Python
python+selenium+autoit实现文件上传功能
Aug 23 #Python
Django与JS交互的示例代码
Aug 23 #Python
You might like
php中去除所有js,html,css代码
2010/10/12 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
jQuery 方法大全方便学习参考
2010/02/25 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
微信小程序中setInterval的使用方法
2017/09/29 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
一文快速详解前端框架 Vue 最强大的功能
2019/05/21 Javascript
JavaScript find()方法及返回数据实例
2020/04/30 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
python定时关机小脚本
2018/06/20 Python
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
10分钟教你用Python实现微信自动回复功能
2018/11/28 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
利用rest framework搭建Django API过程解析
2019/08/31 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
String和StringBuffer的区别
2015/08/13 面试题
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
趣味运动会简讯
2015/07/20 职场文书
理解python中装饰器的作用
2021/07/21 Python
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
Pillow图像处理库安装及使用
2022/04/12 Python
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server