Python - 带有 Quotes 和 Pipe Grep 的子进程

Python - subprocess with Quotes and Pipe Grep

我在尝试将简单的 grep 命令输入 python 时遇到问题。我想在文件或列表中获取以下命令的输出。

grep -c 'some thing' /home/user/* | grep -v :0

这是我拥有的,但它根本不起作用...

thing = str(subprocess.Popen(['grep', '-c', 'some thing', '/home/user/*', '|', 'grep', '-v', ':0'], stdout=subprocess.PIPE)

基本上我需要搜索目录中的文件,如果目录中的任何文件中缺少我的字符串,return 就会得到一个结果。

工作代码(谢谢!!):

thing = subprocess.Popen(('grep -c "some thing" /home/user/* | grep -v ":0"' ),shell=True, stdout=subprocess.PIPE)

管道 | 是一个 shell 特征。您必须将 Popen 与 shell=True 一起使用才能使用它。

要在 Python 中模拟 shell 管道,请参阅 How do I use subprocess.Popen to connect multiple processes by pipes?

#!/usr/bin/env python
import os
from glob import glob
from subprocess import Popen, PIPE

p1 = Popen(["grep", "-c",  'some thing'] + glob(os.path.expanduser('~/*')),
           stdout=PIPE)
p2 = Popen(["grep", "-v", ":0"], stdin=p1.stdout)
p1.stdout.close()
p2.wait()
p1.wait()

要将输出作为字符串,设置 stdout=PIPE 并调用 output = p2.communicate()[0] 而不是 p2.wait()

要抑制诸如 "grep: /home/user/dir: Is a directory" 之类的错误消息,您可以 set stderr=DEVNULL.

您可以在纯 Python:

中实现管道
import os
from glob import glob

for name in glob(os.path.expanduser('~/*')):
    try:
        count = sum(1 for line in open(name, 'rb') if b'some thing' in line)
    except IOError:
        pass # ignore
    else:
        if count: # don't print zero counts
           print("%s:%d" % (name, count))