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

 更新时间:2017年08月23日 17:11:56   投稿:mdxy-dxy  
这篇文章主要介绍了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 等有特定含义
格式转换字符

格式转换为一个百分比符号(%)及其后的格式字符所组成。一般而言,每个%符号在其后都必需有一个参数与之相呼应(只有当%%转换字符出现时会直接输出%字符),而欲输出的数据类型必须与其相对应的转换字符类型相同。

相关文章

  • python3 flask 文件占用未释放问题

    python3 flask 文件占用未释放问题

    这篇文章主要介绍了python3 flask 文件占用未释放问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Python计算机视觉里的IOU计算实例

    Python计算机视觉里的IOU计算实例

    今天小编就为大家分享一篇Python计算机视觉里的IOU计算实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python实现按行分割文件

    python实现按行分割文件

    这篇文章主要为大家详细介绍了python如何实现按行分割文件,python按指定行数分割文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • python中元组的用法整理

    python中元组的用法整理

    在本篇内容里小编给大家整理的是关于python中元组的用法及相关实例,需要的朋友们可以学习下。
    2020-06-06
  • python实现在控制台输入密码不显示的方法

    python实现在控制台输入密码不显示的方法

    这篇文章主要介绍了python实现在控制台输入密码不显示的方法,实例分析了Python基于console模块实现密码显示星号输入的技巧,需要的朋友可以参考下
    2015-07-07
  • python中的map函数语法详解

    python中的map函数语法详解

    map是python内置函数,会根据提供的函数对指定的序列做映射,这篇文章主要介绍了python中的map函数语法详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • PyTorch中torch.manual_seed()的用法实例详解

    PyTorch中torch.manual_seed()的用法实例详解

    在Pytorch中可以通过相关随机数来生成张量,并且可以指定生成随机数的分布函数等,下面这篇文章主要给大家介绍了关于PyTorch中torch.manual_seed()用法的相关资料,需要的朋友可以参考下
    2022-06-06
  • Python如何基于Tesseract实现识别文字功能

    Python如何基于Tesseract实现识别文字功能

    这篇文章主要介绍了Python如何基于Tesseract实现识别文字功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • python unix时间戳转换毫秒的实现

    python unix时间戳转换毫秒的实现

    Unix时间戳是一种常见的时间表示方式,本文主要介绍了python unix时间戳转换毫秒的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • keras小技巧——获取某一个网络层的输出方式

    keras小技巧——获取某一个网络层的输出方式

    这篇文章主要介绍了keras小技巧——获取某一个网络层的输出方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05

最新评论