64

如果我echo a; echo b在 bash 中运行,结果将是两个命令都运行。但是,如果我使用 subprocess 则运行第一个命令,打印出整个行的其余部分。下面的代码回显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")
4

6 回答 6

95

您必须在子进程中使用 shell=True 并且没有 shlex.split:

import subprocess

command = "echo a; echo b"

ret = subprocess.run(command, capture_output=True, shell=True)

# before Python 3.7:
# ret = subprocess.run(command, stdout=subprocess.PIPE, shell=True)

print(ret.stdout.decode())

返回:

a
b
于 2013-07-19T10:11:16.677 回答
27

我只是偶然发现了一种情况,我需要从 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

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

于 2015-03-26T01:01:34.757 回答
15

用“&&”连接命令。

os.system('echo a > outputa.txt && echo b > outputb.txt')
于 2016-08-29T21:25:10.523 回答
3

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

def subprocess_cmd(command):
    output = subprocess.check_output(command, shell=True)
    print output
于 2017-02-21T19:16:30.287 回答
1
>>> command = "echo a; echo b"
>>> shlex.split(command);
    ['echo', 'a; echo', 'b']

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

于 2013-07-19T10:00:50.340 回答
0
import subprocess
cmd = "vsish -e ls /vmkModules/lsom/disks/  | cut -d '/' -f 1  | while read diskID  ; do echo $diskID; vsish -e cat /vmkModules/lsom/disks/$diskID/virstoStats | grep -iE 'Delete pending |trims currently queued' ;  echo '====================' ;done ;"


def subprocess_cmd(command):
    process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
    proc_stdout = process.communicate()[0].strip()
    for line in proc_stdout.decode().split('\n'):
        print (line)

subprocess_cmd(cmd)
于 2021-01-25T15:51:05.993 回答