在Python中同时运行多个bash命令

3
我是一个有用的助手,可以为你翻译文本。
我希望您创建一个可以启动多个bash脚本实例的Python脚本。
我已经尝试过:
import subprocess

    commands = '''
    bashcmd1
    bashcmd2
    bashcmd3
    '''

    process = subprocess.Popen('/bin/bash', stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    out, err = process.communicate(commands)
    print out

但是它停留在bashcmd2,只有在我按下CTRL+C后才会继续。


1
这甚至在bash中都行不通。打开一个shell并将命令粘贴进去。它不会并行运行它们。你要么必须在每个命令后面加上&,要么有三个单独的bash实例。 - FHTMitchell
1个回答

0

你只是在一个bash中运行了3个命令。

如果这些命令没有设置变量或相互依赖(否则你将无法并行化它们),也许你可以创建3个subprocess.Popen实例:

commands = '''
bashcmd1
bashcmd2
bashcmd3
'''

for process in [subprocess.Popen(['/bin/bash', '-c', line], stdout=subprocess.PIPE) 
                for line in commands.split("\n") if line]:  # filter out blank lines
    out, err = process.communicate() # or just rc = process.wait()
    # print out & err

该命令首先创建一个Popen对象的列表推导式(不是生成器,因此进程会立即启动),然后执行communicate等待完成(但同时运行其他进程)

好处是您可以将此技术应用于包含命令的任何脚本,而且您不需要使用shell的&功能(更具可移植性,包括Windows,只要您使用["cmd","/c"前缀而不是bash


1
你缺少了一个冒号 : - FHTMitchell
1
正确。这是因为我只编辑了我的答案425次 :) - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接