python subprocess popen同步命令

时间:2017-06-20 09:19:12

标签: python python-2.7 subprocess

我正在尝试使用popen启动一个接一个地调用两个命令(带有多个参数)的子进程。第二个命令依赖于第一个命令运行,因此我希望使用单个子进程来运行它们而不是生成两个进程并等待第一个进程。

但是我遇到了问题,因为我不确定如何提供两个命令输入或将命令作为单个对象分开。

另外,我尽量避免将shell设置为true。

这基本上就是我要做的事情:

for test in resources:
    command = [
        'pgh',
        'resource',
        'create',
        '--name', test['name'],
        '--description', test['description'],
    ]
    command2 = [
        'pgh',
        'assignment',
        'create',
        '--name', test['name'],
        '--user', test['user'],
    ]


    p = Popen(command, stdout=PIPE, stderr=PIPE)
    stdout, stderr = p.communicate()
    print(stdout)
    print(stderr)

2 个答案:

答案 0 :(得分:1)

在启动另一个命令之前,您必须启动命令并等待完成。您应该对每个命令重复执行此操作。

这可以作为

完成
ps = [ Popen(c, stdout=PIPE, stderr=PIPE).communicate() 
       for c in command]

注意这会启动下一个命令,无论天气如何,第一个命令成功或失败。如果只想在上一个命令成功时启动下一个命令,则使用

def check_execute(commands):
    return_code = 0
    for c in commands:
        p = Popen(c, stdout=PIPE, stderr=PIPE)
        result = p.communicate()
        yield result
        return_code = p.returncode
        if return_code != 0:
            break

答案 1 :(得分:0)

根据我的理解,以下内容适合您。 在上一次完成使用后链接执行。

p1 = subprocess.Popen(command, stdout=subprocess.PIPE)
p2 = subprocess.Popen(command2, stdin=p1.stdout, stdout=subprocess.PIPE)
print p2.communicate()