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中封装GObject模块进行图形化程序编程的教程
Apr 14 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
Python3 queue队列模块详细介绍
Jan 05 Python
Python中几种属性访问的区别与用法详解
Oct 10 Python
详解django的serializer序列化model几种方法
Oct 16 Python
Python分布式进程中你会遇到的问题解析
May 28 Python
python 计算两个列表的相关系数的实现
Aug 29 Python
python中p-value的实现方式
Dec 16 Python
Python实现在Windows平台修改文件属性
Mar 05 Python
python else语句在循环中的运用详解
Jul 06 Python
python 图像增强算法实现详解
Jan 24 Python
Python 制作自动化翻译工具
Apr 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代码书写习惯优化小结
2013/06/20 PHP
PHP的cURL库简介及使用示例
2015/02/06 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
php常用的工具开发整理
2019/09/26 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
javascript实现的上下无缝滚动效果
2016/09/19 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
解决element UI 自定义传参的问题
2018/08/22 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
python删除特定文件的方法
2015/07/30 Python
Python实现类似jQuery使用中的链式调用的示例
2016/06/16 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
Python3多线程基础知识点
2019/02/19 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
酒店司机岗位职责
2013/12/14 职场文书
知识竞赛主持词
2014/03/26 职场文书
新郎结婚感言
2015/07/31 职场文书
中学校园广播稿
2015/08/18 职场文书
LeetCode189轮转数组python示例
2022/08/05 Python