我试图写一个简单的工具,从光盘读取文件,做一些图像处理,并返回算法的结果。由于程序有时可能需要一段时间,我喜欢有一个进度条,以便我知道它在程序中的位置。由于我不喜欢把命令行弄得乱七八糟,而且我是在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上回车的理解是,只要不在任何地方打印换行符,它只会将换行符移动到开头,然后我就可以覆盖以前编写的旧文本。但这似乎没有发生。
还有,在命令行中显示进度条的方法是否比我当前尝试的更好?
Linux中对回车的处理在终端模拟器之间有很大的不同。
通常,人们会使用终端转义代码,告诉终端仿真器在屏幕上移动虚拟“回车”(想想在BBS线上运行的全屏程序)。我知道的是VT100转义码:
\e[A
:向上\e[B
:向下\e[C
:右\e[D
:左\e[1~
:主页\e[4~
:结束其中,
\e
是转义字符,\x1b
。尝试用
\e[1~
替换所有\r
另见this post
尝试在print语句后添加
sys.stdout.flush()
。有可能print
在写入换行符之前不会刷新输出,这不会在这里发生。如果您的终端是线路缓冲的,如果您不发出换行符,则可能需要
sys.stdout.flush()
来查看您的打印。相关问题 更多 >
编程相关推荐