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实现的方法示例
Jul 12 Python
python 读写中文json的实例详解
Oct 29 Python
python如何压缩新文件到已有ZIP文件
Mar 14 Python
详解Django之admin组件的使用和源码剖析
May 04 Python
python pcm音频添加头转成Wav格式文件的方法
Jan 09 Python
浅谈python3.x pool.map()方法的实质
Jan 16 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
Python中random模块常用方法的使用教程
Oct 04 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 Python
python 中的jieba分词库
Nov 23 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 浮点数比较方法详解
2017/05/05 PHP
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
js实现继承的5种方式
2015/12/01 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
web打印小结
2017/01/11 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
关于定制FileField中的上传文件名称问题
2017/08/22 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
js实现转动骰子模型
2019/10/24 Javascript
vue实现放大镜效果
2020/09/17 Javascript
js通过canvas生成图片缩略图
2020/10/02 Javascript
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
python基础教程之对象和类的实际运用
2014/08/29 Python
Python中的字符串替换操作示例
2016/06/27 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
Java面试题:为什么要用Java
2012/05/11 面试题
2014的自我评价
2014/01/13 职场文书
2014年元旦促销活动方案
2014/02/22 职场文书
学习十八大报告感言
2014/02/28 职场文书
超市优秀员工事迹材料
2014/05/01 职场文书
会计系毕业生求职信
2014/05/28 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS
Redis keys命令的具体使用
2022/06/05 Redis