Python使用ctypes调用C标准库printf函数的完整指南

Ryan
Ryan
发布时间:2026-10-13| 3人浏览过
原创

本文详解如何在Python中通过ctypes模块调用C标准库msvcrt的printf函数。文章对比了cdll、windll和oledll三种动态库加载方式,重点解析Python 3中Unicode编码导致的乱码问题,并提供字节转换、wprintf及UTF-8转码三种解决方案。此外,还介绍了在IDLE环境中通过sprintf重定向输出的技巧,并对比了Python print与C printf的参数机制差异。

在Python程序中导入ctypes模块并加载动态链接库时,需区分三种加载器:cdll、windows下的windll和oledll。其中,cdll用于加载遵循标准cdecl调用规范的导出函数;windll用于加载符合stdcall调用规范(即Win32 API原生约定)的导出函数;oledll同样使用stdcall规范,但额外假设函数返回Windows的HRESULT错误代码,若出错则自动抛出Python的WindowsError异常,从而可通过COM函数获取具体错误信息。

通过调用cdll.msvcrt即可使用微软标准的C库msvcrt,该库涵盖了大部分标准C函数。

接下来通过一个简单的示例演示printf函数的使用。

from ctypes import *
msvcrt = cdll.msvcrt
str = "Huanhuan!"
msvcrt.printf("Hello %s\n", str)

此时即可利用C语言中的printf函数进行输出操作。 若在IDLE环境中运行,可能观察不到任何输出,这是因为printf直接写入真实的标准输出流,而非Python的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的值。

综上所述,通过上述多种方法即可解决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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。