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 28 Python
python中日期和时间格式化输出的方法小结
Mar 19 Python
利用python获取某年中每个月的第一天和最后一天
Dec 15 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
Django中间件工作流程及写法实例代码
Feb 06 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
Python多线程threading模块用法实例分析
May 22 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
Python如何用filter函数筛选数据
Mar 05 Python
python代码能做成软件吗
Jul 24 Python
Python 使用Opencv实现目标检测与识别的示例代码
Sep 08 Python
python pyhs2 的安装操作
Apr 07 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 禁止页面缓存输出
2009/01/07 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
PHP实现邮件群发的源码
2013/06/18 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
2013/07/08 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
微信小程序支付之c#后台实现方法
2017/10/19 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
vue实现与安卓、IOS交互的方法
2018/11/02 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
详细解读Python中解析XML数据的方法
2015/10/15 Python
python Django批量导入数据
2016/03/25 Python
python数据处理实战(必看篇)
2017/06/11 Python
在VS2017中用C#调用python脚本的实现
2019/07/31 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
中间件的定义
2016/08/09 面试题
求职简历自我评价范例
2014/03/12 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
道德与公民自我评价
2015/03/09 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书