python - 如何使用 | 执行 shell 命令管进去

标签 python shell

我正在使用 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。

最佳答案

调用 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)

参见 Replacing shell pipeline .

关于python - 如何使用 | 执行 shell 命令管进去,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18050937/

相关文章:

bash - 使用本地提供的列表从远程 postgresql 数据库中删除记录

linux - 使用 sed 删除从特定 HTML 字符串到特定字符串的所有内容

python - 提取字符串中特定列下的值

python,将所有文件从目录树的第 3、4、5 级移动到第 2 级

python - Matplotlib,图例符号之间的垂直空间

linux - 如何用shell脚本读取变量中的多个值

python - pyenv tcshell eval pyenv int 响应非法变量名

linux - 查找和替换函数而不修改参数/变量

python - 在 astropy.modeling 中绑定(bind)参数

python - 单击 Selenium 中的链接后让 Firefox 等待新页面加载?