Eclipse和Python3:ctypes中的printf()为什么在随后的print()语句之后显示在控制台输出中

Eclipse和Python3:ctypes中的printf()为什么在随后的print()语句之后显示在控制台输出中,python,eclipse,printf,pydev,ctypes,Python,Eclipse,Printf,Pydev,Ctypes,我在WindowsVista上运行带有PyDev和Python3.2的Eclipse,并且正在学习Python和ctypes教程 但是,我发现,当我调用msvcrt.printf()打印字符串时,它不会显示在Eclipse的控制台输出中,直到显示了所有其他打印语句 以下是我使用的确切代码: from ctypes import * msvcrt = cdll.msvcrt message_string = "Hello Worlds!\n" printf = msvcrt.printf pr

我在WindowsVista上运行带有PyDev和Python3.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(“测试:%s\n”,…')),这没有什么区别


我想在Eclipse中工作,我不想每次测试脚本时都要打开命令提示符,所以有没有办法修复控制台输出中的这种顺序?为什么会发生这种情况?

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


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

如果C标准库认为stdout连接到文件或管道而不是控制台,它将阻止缓冲区的输出。您可以在
printf
之后发出
fflush
来解决这个问题:

msvcrt.fflush(msvcrt.stdout)
您还可以强制
stdout
进入非缓冲模式:

msvcrt.setvbuf(msvcrt.stdout, None, _IONBF, 0)

感谢您的解释,但对于修复,我得到了以下错误:“AttributeError:函数'stdout'未找到”从msvcrt获取到stdout的指针可能非常困难;看,我只是在遵循一个关于ctypes的教程,我计划稍后将其用于printf以外的函数。我想理解这一点并让它工作的原因是,如果我不能理解这个简单任务的情况,我怎么能理解更复杂的ctypes呢奈斯?