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 相关文章推荐
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
python网络编程学习笔记(六):Web客户端访问
Jun 09 Python
详解在Python和IPython中使用Docker
Apr 28 Python
python字符串string的内置方法实例详解
May 14 Python
python爬取淘宝商品销量信息
Nov 16 Python
将python文件打包成EXE应用程序的方法
May 22 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
使用python+whoosh实现全文检索
Dec 09 Python
python 给图像添加透明度(alpha通道)
Apr 09 Python
Restful_framework视图组件代码实例解析
Nov 17 Python
Pycharm安装python库的方法
Nov 24 Python
python神经网络学习 使用Keras进行简单分类
May 04 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数组函数array_walk用法示例
2016/05/26 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
2016/06/12 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
jQuery AjaxQueue改进步骤
2011/10/06 Javascript
js浮点数精确计算(加、减、乘、除)
2013/12/26 Javascript
js对table的td进行相同内容合并示例详解
2013/12/27 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
js微信分享实现代码
2020/10/11 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
如何根据业务封装自己的功能组件
2019/04/19 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
python生成随机密码或随机字符串的方法
2015/07/03 Python
Python进程间通信之共享内存详解
2017/10/30 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
Python 给某个文件名添加时间戳的方法
2018/10/16 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
2020/02/29 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
2020/04/08 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
信息技术专业个人自我评价
2013/12/11 职场文书
业务部门经理岗位职责
2014/02/23 职场文书
公司担保书格式范文
2014/05/12 职场文书
求职教师自荐书
2014/06/19 职场文书
简易版租房协议书范本
2014/10/13 职场文书
心术观后感
2015/06/11 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android