使用子进程运行多个bash命令

Pau*_*aul 32 python bash subprocess

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

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")
Run Code Online (Sandbox Code Playgroud)

bou*_*gui 60

你必须在子进程中使用shell = True而没有shlex.split:

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')
Run Code Online (Sandbox Code Playgroud)

收益:

a
b
Run Code Online (Sandbox Code Playgroud)

  • 啊,我看到了,我测试了`shell = True`但是command.split()正在打破它(列表).另外要注意其他人阅读,使用`shell = True`是一个安全隐患,请确保您信任输入. (3认同)
  • 你不能在`shell = True`中使用`command.split()`.实际上``subprocess.Popen`与`shell = True`的参数必须是一个字符串而不是一个列表. (2认同)
  • @Ravichandra:注意:标题中的“ bash”。在Windows上,您可能需要`echo a&echo b`命令。 (2认同)

adm*_*nva 15

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

我最终做的是:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 对于Python 3,您可能需要使用:`out,err = process.communicate(commands.encode('utf-8'))`和`print(out.decode('utf-8'))` (3认同)
  • subprocess.check_output(commands,shell = True)可以正常工作。如果命令中有bash-ism,则传递`executable ='/ bin / bash'`。 (2认同)

小智 11

使用"&&"加入命令.

os.system('echo a > outputa.txt && echo b > outputb.txt')
Run Code Online (Sandbox Code Playgroud)

  • 如果第一个命令有错误,则第二个命令不会运行.我会说用一个; 代替. (2认同)
  • 这里的重要部分是使用 `os.system()` 而不是 `subprocess`。 (2认同)