Python打印语句在回车后不输出任何内容
我正在尝试写一个简单的工具,这个工具可以从磁盘读取文件,进行一些图像处理,然后返回算法的结果。因为这个程序有时候运行比较久,我想要一个进度条,这样我就能知道程序进行到哪一步了。由于我不想让命令行看起来太乱,而且我使用的是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
在输出的时候,只有等到写入一个换行符时才会把内容显示出来,而在这里并没有换行符。