我目前正在用C ++编写的python中重写一个小包装器程序。它从文件中提取文件并以另一种格式将其打包。
在C ++中,我需要运行的系统命令的输出是“实时”,即状态栏和实时显示的某些命令的百分比指示器。使用python,我将每个'百分比'单独地放在屏幕上(因为我逐行读取)。这是一个例子:这是一个状态栏在python版本中的样子(这一直持续到100)。在C ++中,它确实会自我更新。
| (02/100)\rImporting AVC-H264: | | (03/100)\rImporting AVC-H264: | | (04/100)\rImporting AVC-H264: |=
这是相应的python代码:
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in iter(p.stdout.readline, ""):
print line,
关于如何让它看起来像在C ++中的任何想法?
答案 0 :(得分:6)
可能是两件事......
readline可能正在改变你的输出中的一些东西
程序。我相信\r
是回车并告诉终端
回到了开头
行然后程序可以输出超出它刚刚输出的文本。
Readline最有可能删除它。
首先要尝试,
p = subprocess.Popen(args, stdout=subprocess.PIPE, \
stderr=subprocess.PIPE, \
universal_newlines=True)
for line in iter(p.stdout.readline, ""):
sys.stdout.write('\r'+line[:-1])
sys.stdout.flush()
你有来执行刷新,因为stdout会缓冲,直到它获得\n
和
当然你不会写一篇。
答案 1 :(得分:1)
在Windows上,您可以输出退格字符(ASCII代码8)。示例(仅使用单个数字打印当前迭代):
>>> import time
>>> import sys
>>> for i in xrange(10):
... sys.stdout.write(str(i))
... time.sleep(.5)
... sys.stdout.write(chr(8))
...
您需要跟踪当前行中的字符数...我确信必须有更好的方法。
在Linux上,您似乎可以编写回车符以重置光标位置。请参阅Erase the current printed console line和In-place progress output in the terminal or console。
答案 2 :(得分:0)
很抱歉,但我不太了解实时部分,但也许我可以帮助“自我更新”部分,试试这个:
for line in iter(p.stdout.readline, ""):
print line + '\r',