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开发编码规范
Sep 08 Python
python连接池实现示例程序
Nov 26 Python
Python实用日期时间处理方法汇总
May 09 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
解决PyCharm同目录下导入模块会报错的问题
Oct 13 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
python实现猜拳小游戏
Apr 05 Python
pandas条件组合筛选和按范围筛选的示例代码
Aug 26 Python
python实现五子棋游戏(pygame版)
Jan 19 Python
python如何输出反斜杠
Jun 18 Python
总结几个非常实用的Python库
Jun 26 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
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
2015/06/25 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
SelectPage v2.4 发布新增纯下拉列表和关闭分页功能
2017/09/07 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
js数组去重的方法总结
2019/01/18 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
Python实现新浪博客备份的方法
2016/04/27 Python
Python实现购物车功能的方法分析
2017/11/10 Python
python reverse反转部分数组的实例
2018/12/13 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
python  logging日志打印过程解析
2019/10/22 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
毕业设计说明书
2014/05/07 职场文书
数学教育专业求职信
2014/07/22 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书
机关作风建设工作总结
2014/10/23 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
校园运动会广播稿
2015/08/19 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
实验心得体会范文
2016/01/25 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书