Python打印语句在回车后不输出任何内容

7 投票
3 回答
6631 浏览
提问于 2025-04-15 22:38

我正在尝试写一个简单的工具,这个工具可以从磁盘读取文件,进行一些图像处理,然后返回算法的结果。因为这个程序有时候运行比较久,我想要一个进度条,这样我就能知道程序进行到哪一步了。由于我不想让命令行看起来太乱,而且我使用的是Unix系统,所以我想用'\r'这个字符在同一行上打印进度条。

但是当我用下面这段代码时,它什么都不显示。


# Files is a list with the filenames
for i, f in enumerate(files):
    print '\r%d / %d' % (i, len(files)),
    # Code that takes a long time

我也试过:


print '\r', i, '/', len(files),

为了确保这在Python中能正常工作,我还试了这个:


heartbeat = 1
while True:
    print '\rHello, world', heartbeat,
    heartbeat += 1

这段代码运行得很好。到底发生了什么呢?我理解在Linux上使用回车符(carriage return)是把光标移动到行的开头,然后可以覆盖之前写的文本,只要我不在任何地方打印换行符就可以了。但现在似乎并没有这样发生。

另外,有没有比我现在尝试的方式更好的方法在命令行中显示进度条呢?

3 个回答

2

如果你的终端是行缓冲的,可能需要使用 sys.stdout.flush() 来看到你打印的内容,特别是当你没有换行的时候。

2

在Linux中,不同的终端模拟器对回车符的处理方式差别很大。

通常,我们会使用一些终端转义代码,这些代码可以告诉终端模拟器在屏幕上移动虚拟的“打印头”(可以想象成在BBS上运行的全屏程序)。我知道的转义代码是VT100转义代码:

\e[A: 向上移动
\e[B: 向下移动
\e[C: 向右移动
\e[D: 向左移动
\e[1~: 回到行首
\e[4~: 到达行尾

这里的\e是转义字符,实际上是\x1b

可以尝试把所有的\r替换成\e[1~

还可以查看这个帖子

10

试着在打印语句后面加上 sys.stdout.flush()。可能是因为 print 在输出的时候,只有等到写入一个换行符时才会把内容显示出来,而在这里并没有换行符。

撰写回答