关于python:使用子进程运行多个bash命令

running multiple bash commands with subprocess

如果我在bash中运行echo a; echo b,结果将是两个命令都运行。但是,如果我使用子进程,那么将运行第一个命令,打印出行的其余部分。下面的代码是echos a; echo b而不是a b,如何让它运行这两个命令?

1
2
3
4
5
6
7
import subprocess, shlex
def subprocess_cmd(command):
    process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE)
    proc_stdout = process.communicate()[0].strip()
    print proc_stdout

subprocess_cmd("echo a; echo b")


在子进程中必须使用shell=true,而不使用shlex.split:

1
2
3
4
5
6
def subprocess_cmd(command):
    process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
    proc_stdout = process.communicate()[0].strip()
    print proc_stdout

subprocess_cmd('echo a; echo b')

返回:

1
2
a
b


我只是偶然发现了一种情况,在这种情况下,我需要在Python中运行一系列bash代码(不使用分号分隔)。在这种情况下,建议的解决方案没有帮助。一种方法是保存一个文件,然后用Popen运行它,但在我的情况下是不可能的。

我最后做的是:

1
2
3
4
5
6
7
8
9
10
commands = '''
echo"a"
echo"b"
echo"c"
echo"d"
'''


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

所以我首先创建子bash进程,然后告诉它要执行什么。这种方法消除了直接将命令传递给Popen构造函数的限制。


使用"&;&;"联接命令。

1
os.system('echo a > outputa.txt && echo b > outputb.txt')


如果一次只运行命令,那么可以使用subprocess.check_output便利功能:

1
2
3
def subprocess_cmd(command):
    output = subprocess.check_output(command, shell=True)
    print output

1
2
3
>>> command ="echo a; echo b"
>>> shlex.split(command);
    ['echo', 'a; echo', 'b']

所以,问题是shlex模块不处理";