在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小时内与您取得联系。