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中用于返回绝对值的abs()方法
May 14 Python
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
使用Pyhton集合set()实现成果查漏的例子
Nov 24 Python
基于h5py的使用及数据封装代码
Dec 26 Python
如何打包Python Web项目实现免安装一键启动的方法
May 21 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
python入门教程之基本算术运算符
Nov 13 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 Python
浅谈Python中的正则表达式
Jun 28 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 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
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
Zepto实现密码的隐藏/显示
2017/04/07 Javascript
AngularJS改变元素显示状态
2017/04/20 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
AngularJS 多指令Scope问题的解决
2018/10/25 Javascript
详解vue项目接入微信JSSDK的坑
2018/12/14 Javascript
Vue分页器实现原理详解
2019/06/28 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
python爬取m3u8连接的视频
2018/02/28 Python
django foreignkey(外键)的实现
2019/07/29 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
Python调用.NET库的方法步骤
2019/12/27 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
会计实习期自我鉴定
2013/10/06 职场文书
生产车间主任的个人自我鉴定
2013/10/25 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
Pytorch中TensorBoard及torchsummary的使用详解
2021/05/12 Python
SQL SERVER中的流程控制语句
2022/05/25 SQL Server