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 25 Python
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
Python Web框架Tornado运行和部署
Oct 19 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
简单了解python协程的相关知识
Aug 31 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 Python
教你怎么用python实现字符串转日期
May 24 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
Mar 25 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获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
PHP开发中的错误收集,不定期更新。
2011/02/03 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
IE6 fixed的完美解决方案
2011/03/31 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
vue实现搜索功能
2019/05/28 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
Python中defaultdict与lambda表达式用法实例小结
2018/04/09 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
python画图的函数用法以及技巧
2019/06/28 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
留学生求职信
2014/06/03 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
2015年推普周活动总结
2015/03/27 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
教师节座谈会主持词
2015/07/03 职场文书