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爬虫包 BeautifulSoup  递归抓取实例详解
Jan 28 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
简单了解django orm中介模型
Jul 30 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
Nov 15 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
Mar 06 Python
Django如何批量创建Model
Sep 01 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
Dec 28 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 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导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
JS鼠标事件大全 推荐收藏
2011/11/01 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
js闭包的用途详解
2014/11/09 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
详解Javascript ES6中的箭头函数(Arrow Functions)
2016/08/24 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
js学习之----深入理解闭包
2016/11/21 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
Python实现简单登录验证
2016/04/13 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
工程地质勘察专业大学生求职信
2013/10/13 职场文书
写给女朋友的道歉信
2014/01/08 职场文书
小学端午节活动总结
2015/02/11 职场文书
党支部培养考察意见
2015/06/02 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers
教你怎么用Python实现多路径迷宫
2021/04/29 Python
Nginx配置之实现多台服务器负载均衡
2021/08/02 Servers