全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python调用ctypes使用C函数printf的方法

在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  # printf  # python 调用c语言函数的方法  # Python实现的调用C语言函数功能简单实例  # Python调用C/C++函数库的多种方法与实践指南  # Python调用C函数的5种方式总结大比拼(第3种最高效却鲜为人知)  # 的是  # 好了  # 三种  # 自带  # 转换为  # 就可以  # 有一个  # 而不是  # 动态链接库  # 错误代码  # 这一  # 将会  # 没有任何  # 要用  # 如果没有  # 这么大  # 不支持  # 可以使用  # 再用  # 这是因为 


相关文章: IOS倒计时设置UIButton标题title的抖动问题  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  定制建站策划方案_专业建站与网站建设方案一站式指南  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何通过WDCP绑定主域名及创建子域名站点?  金*站制作公司有哪些,金华教育集团官网?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  个人网站制作流程图片大全,个人网站如何注销?  完全自定义免费建站平台:主题模板在线生成一站式服务  网站设计制作企业有哪些,抖音官网主页怎么设置?  无锡营销型网站制作公司,无锡网选车牌流程?  ,在苏州找工作,上哪个网站比较好?  代购小票制作网站有哪些,购物小票的简要说明?  如何在阿里云购买域名并搭建网站?  如何在阿里云通过域名搭建网站?  小程序网站制作需要准备什么资料,如何制作小程序?  建站之星客服服务时间及联系方式如何?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  如何通过山东自助建站平台快速注册域名?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  微信推文制作网站有哪些,怎么做微信推文,急?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  制作网站的基本流程,设计网站的软件是什么?  ,南京靠谱的征婚网站?  建站之星ASP如何实现CMS高效搭建与安全管理?  如何在新浪SAE免费搭建个人博客?  Python如何创建带属性的XML节点  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  建站之星与建站宝盒如何选择最佳方案?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何快速查询网站的真实建站时间?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  高端智能建站公司优选:品牌定制与SEO优化一站式服务  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  如何在万网自助建站平台快速创建网站?  高防服务器租用如何选择配置与防御等级?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  建站之星24小时客服电话如何获取?  如何基于云服务器快速搭建个人网站?  如何通过万网虚拟主机快速搭建网站?  如何高效完成自助建站业务培训?  如何快速配置高效服务器建站软件?  建站之星价格显示格式升级,你的预算足够吗?  太平洋网站制作公司,网络用语太平洋是什么意思?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  沈阳制作网站公司排名,沈阳装饰协会官方网站?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速搭建高效WAP手机网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。