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))
我在尝试将简单的 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))