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)
答案 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))