我正在尝试运行未知数量的命令并在文件中捕获它们的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的解决方案将非常受欢迎。提前谢谢!
答案 0 :(得分:0)
非常感谢Adam Matan对biggest hint的解决方案。这就是我想出来的,它完美无缺:
Thread
对象以下是代码:
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!")