7

我正在使用 python 的子进程call()来执行 shell 命令。它适用于单个命令。但是,如果我的 shell 命令调用一个命令并将其通过管道传递给另一个命令呢?

即如何在 python 脚本中执行这个?

grep -r PASSED *.log | sort -u | wc -l

我正在尝试使用 Popen 方式,但我总是得到 0 作为输出

p1 = subprocess.Popen(("xxd -p " + filename).split(), stdout=subprocess.PIPE)
p2 = subprocess.Popen("tr -d \'\\n\'".split(), stdin=p1.stdout, stdout=subprocess.PIPE)
p3 = subprocess.Popen(("grep -c \'"+search_str + "\'").split(), stdin=p2.stdout, stdout=subprocess.PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
p2.stdout.close()  # Allow p2 to receive a SIGPIPE if p3 exits.
output = p3.communicate()[0]

当我在 shell 中尝试命令时,它返回 1

 xxd -p file_0_4.bin | tr -d '\n'  | grep -c 'f5dfddd239'

我总是得到 0。即使我在 shell 上键入相同的命令时得到 1。

4

3 回答 3

22

shell=True参数调用。例如,

import subprocess

subprocess.call('grep -r PASSED *.log | sort -u | wc -l', shell=True)

艰辛的道路

import glob
import subprocess

grep = subprocess.Popen(['grep', '-r', 'PASSED'] + glob.glob('*.log'), stdout=subprocess.PIPE)
sort = subprocess.Popen(['sort', '-u'], stdin=grep.stdout, stdout=subprocess.PIPE)
exit_status = subprocess.call(['wc', '-l'], stdin=sort.stdout)

请参阅更换外壳管道

于 2013-08-05T05:14:56.260 回答
4

The other answers would work. But here's a more elegant approach, IMO, which is to use plumbum.

from plumbum.cmd import grep, sort, wc
cmd = grep['-r']['PASSED']['*.log'] | sort['-u'] | wc['-l']  # construct the command
print cmd() # run the command
于 2013-08-05T05:38:00.253 回答
0

您可能想看这里这里那就是使用带有 shell=True 的“子进程”

于 2013-08-05T05:16:17.183 回答