同时wait()多个subproccess.Popen命令,然后退出

时间:2017-03-14 23:20:13

标签: python subprocess stdout

我正在尝试运行未知数量的命令并在文件中捕获它们的stdout。但是,在每个实例上尝试p.wait()时,我遇到了一个困难。我的代码看起来像这样:

print "Started..."
for i, cmd in enumerate(commands):
    i = "output_%d.log" % i
    p = Popen(cmd, shell=True, universal_newlines=True, stdout=open(i, 'w'))
    p.wait()
print "Done!"

我正在寻找一种方法同时执行commands中的所有内容,并在每个进程完成后退出当前脚本 。当每个命令返回退出代码时,它也会有所帮助。

我已经查看了一些答案,包括JF Sebastian的this one,并尝试通过将args=(p.stdout, q)更改为args=(p.returncode, q)来适应我的情况,但最终立即退出并运行背景(可能是由于shell=True?),以及没有响应在bash shell中按下的任何键...我不知道该去哪里。

Jeremy Brown's answer也有帮助,但是select.epoll()抛出了一个AttributeError异常。

还有其他无缝方法或技巧可以使它运作吗?它不需要是跨平台的,GNU / Linux和macOS的解决方案将非常受欢迎。提前谢谢!

2 个答案:

答案 0 :(得分:0)

非常感谢Adam Matan对biggest hint的解决方案。这就是我想出来的,它完美无缺:

  1. 它并行启动每个Thread对象
  2. 同时启动每个实例
  3. 最后,它等待每个退出代码而不阻止其他线程
  4. 以下是代码:

    import threading
    import subprocess
    
    ...
    
    def run(cmd):
        name = cmd.split()[0]
        out = open("%s_log.txt" % name, 'w')
        err = open('/dev/null', 'w')
        p = subprocess.Popen(cmd.split(), stdout=out, stderr=err)
        p.wait()
        print name + " completed, return code: " + str(p.returncode)
    
    ...
    
    proc = [threading.Thread(target=run, args=(cmd)) for cmd in commands]
    [p.start() for p in proc]
    [p.join() for p in proc]
    print "Done!"
    

答案 1 :(得分:0)

我宁愿将此添加为注释,因为我正在处理所有Spades回答的Jack。我无法使该确切命令正常工作,因为它正在解压缩我所拥有的命令的字符串列表。

这是我对python3的修改:

import subprocess
import threading

commands = ['sleep 2', 'sleep 4', 'sleep 8']

def run(cmd):
    print("Command %s" % cmd)
    name = cmd.split(' ')[0]
    print("name %s" % name)
    out = open('/tmp/%s_log.txt' % name, 'w')
    err = open('/dev/null', 'w')
    p = subprocess.Popen(cmd.split(' '), stdout=out, stderr=err)
    p.wait()
    print(name + " completed, return code: " + str(p.returncode))


proc = [threading.Thread(target=run, kwargs={'cmd':cmd}) for cmd in commands]
[p.start() for p in proc]
[p.join() for p in proc]
print("Done!")
相关问题