从存储的subprocess.Popen对象

时间:2015-09-21 20:36:09

标签: python-2.7 subprocess

如果我有一个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对象的输入?

1 个答案:

答案 0 :(得分:1)

Python 2.7中没有Popen.args。您可以使用字典而不是processes的列表,其中键为Popen个实例,值为Popen个参数。