subprocess.popen()的实时输出而不是逐行输出

时间:2011-01-06 22:17:00

标签: python subprocess popen

我目前正在用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 ++中的任何想法?

3 个答案:

答案 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 lineIn-place progress output in the terminal or console

答案 2 :(得分:0)

很抱歉,但我不太了解实时部分,但也许我可以帮助“自我更新”部分,试试这个:

for line in iter(p.stdout.readline, ""):
   print line + '\r',