5

我在 Windows Vista 上运行带有 PyDev 和 Python 3.2 的 Eclipse,并且正在学习有关 Python 和 ctypes 的教程。

但是,我发现当我调用 msvcrt.printf() 打印字符串时,在所有其他打印语句都显示之前,Eclipse 的控制台输出中不会显示该字符串。

这是我使用的确切代码:

from ctypes import *

msvcrt = cdll.msvcrt
message_string = "Hello Worlds!\n"

printf = msvcrt.printf
print(printf("Testing: %s".encode('ascii'),message_string.encode('ascii')))


print("foo")

print("why!?")

这是输出:

23
foo
why!?
Testing: Hello Worlds!

我在其他地方看到的唯一解释(对于一般的 C)提到 printf 如何被缓冲并且在显示之前需要换行符,但是字符串中有换行符,我还直接在 printf 语句中添加了一个('printf("Testing : %s\n",...') 并没有什么区别。

我想在 Eclipse 中工作,我不想每次我想测试脚本时都打开命令提示符,那么有什么方法可以在控制台输出中修复这个顺序吗?为什么会这样?

4

2 回答 2

1

如果 C 标准库认为stdout连接到文件或管道而不是控制台,它将对其输出进行块缓冲。fflush您可以通过发出after来解决此问题printf

msvcrt.fflush(msvcrt.stdout)

您也可以强制stdout进入非缓冲模式:

msvcrt.setvbuf(msvcrt.stdout, None, _IONBF, 0)
于 2012-07-25T16:59:26.720 回答
0

虽然这不能回答您的问题,但 printf 返回23的是打印字符的数量,您可以将其替换为sprintfand ,这将返回字符串并以正确的预期顺序显示在控制台中。

但是,当您可以对 python 执行相同操作时,我看不到使用 mscvcrt 的 printf 的理由。

于 2012-07-25T16:38:47.340 回答