Python - 带引号和Pipe Grep的子流程

时间:2015-01-12 22:27:44

标签: python subprocess

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

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)

基本上我需要搜索目录中的文件,如果目录中的任何文件都缺少我的字符串,则返回结果。

工作代码(谢谢!):

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

要在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))