print输出后time.sleep(n),如果输出不换行,为什么看不到任何输出?

python 初学者的疑惑:

这样写看不到任何输出:(如果crtl+c 中断,事实上是有输出的,只是没有显示出来。这是为什么?)

import time,sys

while 1:
    print("#",end="")
    time.sleep(2)

这样写可以:

import time,sys

while 1:
    print("#")
    time.sleep(2)

阅读 6.8k
3 个回答
import time

while 1:
    print("#", end="", flush=True)
    time.sleep(2)

print函数会先将数据读入一个缓冲区,直到遇到换行符或者数据达到缓冲区大小(这里是8KB),才将数据写入sys.stdout。
也就是说,你的第一个code等个8192*2多秒(实际上不止)就能看到它的输出了。

以下是大胆地瞎猜内容
在C/C++中,输出到标准输出流里面的内容首先会被写到一个缓冲区内,而不是立即显示在屏幕上,例如下面这个程序

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    while (1)
    {
        printf("%c", '#');
        sleep(1);
    }
}

编译运行,你不会看到任何输出,因为只有在缓冲区中出现换行符\n 或者你手动清空缓冲区时,里面的内容才会输出到屏幕上。下面这个程序就可以

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    while (1)
    {
        printf("%c", '#');
        fflush(stdout);
        // 或者直接这样
        // printf("%c\n", '#');
    sleep(1);
    }
}

所以python解释器里面的标准输出可能也是带缓冲的,你的第一个例子是没有\n 的,而第二个是有的。

简单查了一下资料也发现是这样的,可以用sys.stdout.flush() 或者采用楼上的方案

推荐问题
宣传栏