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 %sn",str) 这样就可以使用C语言中的printf函数进行输出。 如果使用的是Py3K,在控制台里会看到只有开头字符H被输出了。因为Py3K使用的是Unicode编码,而printf不支持该编码,所以需要转码。整理出来三种改写方法可以解决这一问题。 # A 转为byte类型 在字符串前面加b from ctypes import * msvcrt = cdll.msvcrt str = b"Huanhuan!" msvcrt.printf(b"Hello %sn",str) # B 使用wprintf宽字符显示 from ctypes import * msvcrt = cdll.msvcrt str = "Huanhuan!" msvcrt.wprintf("Hello %sn",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 %sn',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 字符串来转换并格式化数据,然后将结果输出到标准输出设备(显示器),直到出现字符串结束(' ')为止。 一般文本,将会直接输出 格式转换为一个百分比符号(%)及其后的格式字符所组成。一般而言,每个%符号在其后都必需有一个参数与之相呼应(只有当%%转换字符出现时会直接输出%字符),而欲输出的数据类型必须与其相对应的转换字符类型相同。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |