Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python子进程popen同步命令_Python_Python 2.7_Subprocess - Fatal编程技术网

python子进程popen同步命令

python子进程popen同步命令,python,python-2.7,subprocess,Python,Python 2.7,Subprocess,我试图使用popen启动一个子进程,该子进程一个接一个地调用两个命令(带有多个参数)。第二个命令依赖于第一个命令的运行,因此我希望使用一个子进程同时运行这两个命令,而不是生成两个进程并等待第一个 但是我遇到了一些问题,因为我不知道如何给出两个命令输入,或者如何将命令作为一个对象分开 另外,如果可能的话,我会尽量避免将shell设置为true 这基本上就是我要做的: for test in resources: command = [ 'pgh', 'res

我试图使用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)

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

这可以按如下方式完成

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

根据我的理解,以下内容适用于您。 若要在上一个完成后链接执行,请使用

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

你能更具体一点问题是什么吗?是什么阻止您使用
command2
第二次调用
Popen
?我希望使用相同的进程,因为这些命令需要按顺序调用,因此一个子进程可以一个接一个地运行这两个命令,而不是多个子进程。那么问题应该是“顺序”而不是“同步”吗?