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 深入理解yield
Sep 06 Python
使用Python写个小监控
Jan 27 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
python增加矩阵维度的实例讲解
Apr 04 Python
python实现下载pop3邮件保存到本地
Jun 19 Python
Python实现常见的回文字符串算法
Nov 14 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
python 输出列表元素实例(以空格/逗号为分隔符)
Dec 25 Python
Python常用库大全及简要说明
Jan 17 Python
基于python模拟TCP3次握手连接及发送数据
Nov 06 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 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/03/21 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
ThinkPHP模板判断输出Present标签用法详解
2014/06/30 PHP
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
ucenter中词语过滤原理分析
2016/07/13 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
2019/12/13 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
基于jquery的图片懒加载js
2010/06/30 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
jquery实现两边飘浮可关闭的对联广告
2015/11/27 Javascript
javascript实现可键盘控制的抽奖系统
2016/03/10 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
微信小程序 开发之顶部导航栏实例代码
2017/02/23 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
python基于queue和threading实现多线程下载实例
2014/10/08 Python
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
python模仿网页版微信发送消息功能
2018/02/24 Python
python针对excel的操作技巧
2018/03/13 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
Python tkinter三种布局实例详解
2020/01/06 Python
python读取与处理netcdf数据方式
2020/02/14 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
端午节粽子促销活动方案
2014/02/02 职场文书
高三复习计划
2015/01/19 职场文书