Python print语句不带回车符

时间:2010-05-12 18:05:08

标签: python command-line carriage-return

我正在尝试编写一个简单的工具,从光盘读取文件,进行一些图像处理,并返回算法的结果。由于该程序有时需要一段时间,我喜欢有一个进度条,所以我知道它在程序中的位置。由于我不喜欢混乱我的命令行而且我在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上回车的理解是它只是将换行符移动到开头然后我可以覆盖以前写过的旧文本,只要我不在任何地方打印换行符。但这似乎并没有发生。

此外,是否有更好的方法在命令行中显示进度条,而不是我当前尝试做的?

3 个答案:

答案 0 :(得分:10)

尝试在print语句后添加sys.stdout.flush()print有可能在写入换行符之前不刷新输出,这在此处不会发生。

答案 1 :(得分:2)

Linux中回车的处理在终端仿真器之间差别很大。

通常,人们会使用终端转义码来告诉终端模拟器在屏幕上移动虚拟“托架”(想想在BBS线路上运行的全屏程序)。我所知道的是VT100转义码:

\e[A:up \e[B:下来 \e[C:右 \e[D:左 \e[1~:家庭 \e[4~:结束

其中\e是转义字符\x1b

尝试用\r

替换所有\e[1~

另见this post

答案 2 :(得分:2)

如果您的终端是线路缓冲的,如果您没有发出换行符,可能需要sys.stdout.flush()才能看到您的打印。