【发布时间】:2014-12-09 06:03:54
【问题描述】:
我不知道我打算做的事情是否可能或合理,所以我愿意接受任何建议。
目前我有一个脚本,它启动 some.exe id 的 n 个子进程,我经常 poll() 确定它们是否终止,如果是,则以哪个错误级别终止。子进程保存在字典中(键 = 子进程,值 = id)。 n 个 some.exe 实例保持运行,每个实例都有自己的 id,直到预定义列表的每个 id 都已处理完毕。
some.exe 上没有 gui,它将进度写入标准输出,我不需要。现在,由于某种原因,some.exe 有时不会继续,就好像它会等待一样 - 因此poll() 永远不会产生错误级别,done = proc.poll() is not None 永远不会是真的。迟早会导致我对 n procs 的判断,所有这些都处于非活动状态并且整体进度被卡住了。
如果在 cmd 中手动发出,some.exe 带有一个 id,它会在脚本中显示这种行为 - 工作得很好。
因此我的想法是从脚本中启动一个新的 cmd 窗口,该窗口使用 id 运行 some.exe,但我应该仍然能够poll() 说 exe。
这是大致到目前为止我所拥有的:
while id_list > 0:
if len(proc_dict) < n:
id = next_id()
proc = subprocess.Popen(["some.exe", id], stdout=PIPE)
proc.poll()
proc_dict[proc] = id
else:
done_procs = []
for proc in proc_dict.keys():
done = proc.poll() is not None
if done:
print("returncode: "+proc.returncode)
done_procs.append(proc)
if done_procs:
for p in done_procs:
del proc_dict[p]
time.sleep(2)
编辑:如果我在sleep 所在的else: 中proc.communicate()[0],some.exe 能够继续/完成,但是当communicate 等待进程时,它会拖慢脚本的速度。
【问题讨论】:
-
some.exe 是否有大量输出到标准输出?
-
我会这么说.. 输出各不相同,但大约 20-100 行或更多。
-
把
stdout=PIPE拿出来还有问题吗? -
我刚刚对其进行了测试,似乎没有
stdout=PIPE..!我在那里达到了一些限制吗?非常感谢!还有其他方法可以抑制标准输出吗?
标签: python windows command-line subprocess return-code