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 26 Python
非递归的输出1-N的全排列实例(推荐)
Apr 11 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
Jul 06 Python
Python3 加密(hashlib和hmac)模块的实现
Nov 23 Python
ubuntu中配置pyqt4环境教程
Dec 27 Python
Python 3.8 新功能大揭秘【新手必学】
Feb 05 Python
pandas中ix的使用详细讲解
Mar 09 Python
pandas 强制类型转换 df.astype实例
Apr 09 Python
深入了解Python 变量作用域
Jul 24 Python
Django web自定义通用权限控制实现方法
Nov 24 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 Python
Python OpenCV实现图像模板匹配详解
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
DSP接收机前端设想
2021/03/02 无线电
PHP遍历二维数组的代码
2011/04/22 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
php curl选项列表(超详细)
2013/07/01 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
javascript中对对层的控制
2006/12/29 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
Python sys.path详细介绍
2013/10/17 Python
Python的高级Git库 Gittle
2014/09/22 Python
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
浅谈keras保存模型中的save()和save_weights()区别
2020/05/21 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
Steve Madden官网:美国鞋类品牌
2017/01/29 全球购物
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
女生节标语
2014/06/26 职场文书
优秀党员先进材料
2014/12/18 职场文书
美术教师求职信范文
2015/03/20 职场文书
2016年小学教师政治学习心得体会
2016/01/23 职场文书
工作简历的自我评价
2019/05/16 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技