如果我有一个subprocess.Popen
个对象的列表,有没有办法告诉生成它们时最初使用的命令?
Python 2.7
上下文 我有一个列出了各种命令的列表。如果其中一个测试失败,脚本会清理环境。我想再尝试那些失败的命令。
注意:以下命令仅用于演示目的;在我的产品代码中调用的那些更复杂,但这是不重要的。如果我可以使用它,它将适用于我的prod cmds。
commands = [['nosetests', '-V'],
['nosetests', '--collect-only'],
['nosetests', '--with-id']
]
def cleanup_env():
...do things...
def run_in_parallel(cmds, retry):
retry_tasks = []
if not cmds:
return
def done(p):
return p.poll() is not None
def success(p):
return p.returncode == 0
def fail(p):
if not retry:
retry_tasks.append(p)
print("{} failed, will need to retry.".format(retry_tasks))
else:
pass # if this is already a retry, we don't care, not going to retry again
MAX_PARALLEL = 4
processes = []
while True:
while cmds and len(processes) < MAX_PARALLEL:
task = cmds.pop() # pop last cmd off the stack
processes.append(subprocess.Popen(task))
for p in processes:
if done(p):
if success(p):
processes.remove(p)
else:
fail(p)
processes.remove(p)
if not processes and not cmds:
break
else:
time.sleep(0.05)
return retry_tasks
调用上述内容:
retry_list=run_in_parallel(commands, False)
if retry_list:
cleanup_env()
run_in_parallel(retry_list, True)
第一部分有效,但调用重试并不是因为我传递了subprocess.Popen
个对象的列表,而不是它们的初始输入。
因此问题是,如何获得subprocess.Popoen
对象的输入?
答案 0 :(得分:1)
Python 2.7中没有Popen.args
。您可以使用字典而不是processes
的列表,其中键为Popen
个实例,值为Popen
个参数。