如何用|来执行shell命令 管道里面

mic*_*ael 7 python shell

我正在使用python的子进程call()来执行shell命令.它适用于单个命令.但是,如果我的shell命令调用命令并将其传递给另一个命令,该怎么办?

即我如何在python脚本中执行此操作?

grep -r PASSED *.log | sort -u | wc -l
Run Code Online (Sandbox Code Playgroud)

我试图使用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]
Run Code Online (Sandbox Code Playgroud)

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

 xxd -p file_0_4.bin | tr -d '\n'  | grep -c 'f5dfddd239'
Run Code Online (Sandbox Code Playgroud)

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

fal*_*tru 22

shell=True参数调用.例如,

import subprocess

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

艰辛的道路

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

请参阅替换shell管道.