ctypes: printf返回的是int类型的长度而不是字符串

2 投票
4 回答
2160 浏览
提问于 2025-04-16 11:46

我在用ctypes这个库,并且在Python 2.5里加载了msvcrt.dll这个文件。

>>> from ctypes import *
>>> libname = 'msvcrt.dll'
>>> libc = CDLL(libname)
>>> libc.printf("Hello World\n")
12
>>>  

为什么它不打印出Hello World呢?

4 个回答

1

对于那些来到这里却在Python 3.x上无法让这个工作的人,原因是你必须传递一个字节字符串(b"whatever"),而不是普通的Python字符串。

所以这段代码在我的OSX High Sierra上运行得很好:

from ctypes import *

libc = CDLL('/usr/lib/libc.dylib')
libc.printf(b"Testing: hello world")
4

为什么它不打印“Hello World”?

在我的Python(ActiveState,2.6)中,从控制台运行时是可以打印的:

>>> from ctypes import *
>>> libc = CDLL('msvcrt.dll')
>>> libc.printf("Hello world\n")
Hello world
12


(来源:typepad.com)

3

C语言中的 printf() 函数是用来输出内容的,它会返回输出的字符数量。这就是当你在Python中调用 libc.printf() 时,Python所接收到的值。

ctypes 教程 提供了关于为什么 printf() 的输出在你的Python REPL(我猜测你是在使用Windows的GUI IDLE)中可能无法正常工作的原因。

撰写回答