我正在尝试观看一个过程并等待某种模式,比如说:
open someFile id=123
然后,在那之后,我想等待
close id=123
我尝试按如下方式编写脚本:
running_procs = [Popen(["process", "and", "options"], stdout=PIPE, stderr=PIPE)]
while running_procs:
for proc in running_procs:
retcode = proc.poll()
if retcode is not None: # Process finished.
running_procs.remove(proc)
break
else:
while True:
next_line = proc.stdout.readline()
if next_line == '' and proc.poll() != None:
break
m = re.search( r'someFile.*id\=([0-9]*)', next_line, re.M|re.I)
if m:
print m.group(1)
但似乎表现得太慢了。有关处理管道中许多线路的任何建议吗?有更快的方法吗?
答案 0 :(得分:3)
这个具体示例中没有任何内容表明它应该仅仅因为代码而变慢。由于列表中只有一个进程,因此只需在进程可用时快速读取行。这意味着代码将依赖于子流程刷新其输出并使行可用。但这确实是可以预期的。
由于您将始终逐行阅读,您可能需要在Popen中设置bufsize=1
,以确保其始终行缓冲:
Popen(["process"], stdout=PIPE, stderr=PIPE, bufsize=1)
但是,如果您打算运行多个进程,我会看到一个问题,正如您使用可能进程列表并从中弹出死的进程所表明的那样。您的循环将一次阻止一个进程。如果您没有打算以串行方式读取进程,那么这将导致数据恢复速度变慢。它们并行运行,但只能串行监控。
除此之外,您还需要详细了解为什么您认为结果缓慢以及您希望发生什么。