running multiple bash commands with subprocess
如果我在bash中运行
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代码(不使用分号分隔)。在这种情况下,建议的解决方案没有帮助。一种方法是保存一个文件,然后用
我最后做的是:
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进程,然后告诉它要执行什么。这种方法消除了直接将命令传递给
使用"&;&;"联接命令。
1 | os.system('echo a > outputa.txt && echo b > outputb.txt') |
如果一次只运行命令,那么可以使用
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模块不处理";