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 时间操作例子和时间格式化参数小结
Apr 24 Python
在Python程序中操作文件之flush()方法的使用教程
May 24 Python
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
Aug 27 Python
python实现银行管理系统
Oct 25 Python
对tensorflow中cifar-10文档的Read操作详解
Feb 10 Python
Python不支持 i ++ 语法的原因解析
Jul 22 Python
Python如何使用ConfigParser读取配置文件
Nov 12 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 Python
Python之京东商品秒杀的实现示例
Jan 06 Python
Python 数据可视化之Seaborn详解
Nov 02 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 页面执行时间计算代码
2008/12/04 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
PHP中Socket连接及读写数据超时问题分析
2016/07/19 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
js实现数组转换成json
2015/06/26 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
JS回调函数简单用法示例
2017/02/09 Javascript
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
Python操作Word批量生成文章的方法
2015/07/28 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
阿迪达斯芬兰官方网站:adidas芬兰
2017/01/30 全球购物
介绍一下Linux中的链接
2016/05/28 面试题
售后客服个人自我评价
2014/09/14 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
乡镇群众路线教育实践活动整改措施
2014/10/04 职场文书
商铺租房协议书范本
2014/12/04 职场文书
会计工作能力自我评价
2015/03/05 职场文书
生日宴会祝酒词
2015/08/10 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书