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中for循环的使用
Apr 14 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
Python+Pyqt实现简单GUI电子时钟
Feb 22 Python
pandas DataFrame的修改方法(值、列、索引)
Aug 02 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
浅谈PyTorch中in-place operation的含义
Jun 27 Python
python获取系统内存占用信息的实例方法
Jul 17 Python
基于python调用jenkins-cli实现快速发布
Aug 14 Python
详解python命令提示符窗口下如何运行python脚本
Sep 11 Python
python使用re模块爬取豆瓣Top250电影
Oct 20 Python
分布式全文检索引擎ElasticSearch原理及使用实例
Nov 14 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 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面向对象法则
2012/02/23 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
smarty循环嵌套用法示例分析
2016/07/19 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
详解Vue中CSS样式穿透问题
2019/09/12 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python排序方法实例分析
2015/04/30 Python
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
利用python修改json文件的value方法
2018/12/31 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
2020/06/17 Python
HTML5有哪些新特征
2015/12/01 HTML / CSS
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
2014年庆元旦活动方案
2014/02/15 职场文书
《中华少年》教学反思
2014/02/15 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
篝火晚会主持词
2014/03/25 职场文书
副处级干部考察材料
2014/05/17 职场文书
小学安全汇报材料
2014/08/14 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
暑期社会实践个人总结
2015/03/06 职场文书
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python
Python绘制散点图之可视化神器pyecharts
2022/07/07 Python