【问题标题】:python subprocess popen synchronous commandspython子进程popen同步命令
【发布时间】:2017-11-22 18:00:55
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

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

标签: python python-2.7 subprocess


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 2018-12-05
      相关资源
      最近更新 更多