实时输出子流程.popen()而不是林书豪

2024-04-25 20:05:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在用Python重写一个小包装程序,我曾经用C++编写过。它从文件中提取文件并以另一种格式将其装箱。在

在C++中,我需要运行的系统命令的输出是“实时”,即状态栏和一些命令的百分比指示符,其中显示的是实时命令。使用python,我会将每个百分比单独地转储到屏幕上(因为我逐行读取它)。下面是一个例子:状态栏在python版本中的外观(一直持续到100)。在C++中,它确实更新了自己。在

| (02/100)\rImporting AVC-H264: |                    | (03/100)\rImporting AVC-H264: |                       | (04/100)\rImporting AVC-H264: |=

这是相应的python代码:

^{pr2}$ 有什么想法让我能让它看起来像C++吗?在


Tags: 文件命令程序屏幕格式例子小包装百分比
3条回答

可能是两件事。。。在

很可能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和 当然你不是在写。在

在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。在

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

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

相关问题 更多 >