如何在Python中搜索特定单词的子进程输出?

时间:2014-04-24 14:41:59

标签: python grep subprocess

我正在尝试搜索变量的输出以查找特定的单词,然后如果为True则触发响应。

variable = subprocess.call(["some", "command", "here"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

for word in variable:
    if word == "myword":
        print "something something"

我确定我在这里遗漏了一些大事,但我无法弄清楚它是什么。

提前感谢我帮我。

5 个答案:

答案 0 :(得分:2)

使用subprocess.check_output。这将返回流程的标准输出。 call仅返回退出状态。 (您需要在输出上拨打splitsplitlines。)

答案 1 :(得分:2)

您需要检查流程的标准输出,您可以执行以下操作:

mainProcess = subprocess.Popen(['python', file, param], stdout=subprocess.PIPE, stderr=subprocess.PIPE)  
communicateRes = mainProcess.communicate() 
stdOutValue, stdErrValue = communicateRes

# you can split by any value, here is by space
my_output_list = stdOutValue.split(" ")

# after the split we have a list of string in my_output_list 
for word in my_output_list :
    if word == "myword":
        print "something something"

这是针对stdout的,你也可以查看stderr,还有一些关于split的信息

答案 2 :(得分:0)

首先,您应该使用Popencheck_output来获取流程输出,然后使用communicate()方法获取stdout和stderr并在这些变量中搜索您的单词:

variable = subprocess.Popen(["some", "command", "here"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = variable.communicate()
if (word in stdout) or (word in stderr):
    print "something something"

答案 3 :(得分:0)

subprocess.call返回进程退出代码,而不是stdout。有关如何捕获命令输出的this help page示例。如果您计划使用子流程执行更复杂的操作,pexpect可能会更方便。

答案 4 :(得分:0)

如果输出可能无限制,那么您不应该使用.communicate()来避免计算机内存不足。你可以阅读子流程'逐行输出:

import re
from subprocess import Popen, PIPE

word = "myword"
p = Popen(["some", "command", "here"], 
          stdout=PIPE, universal_newlines=True)
for line in p.stdout: 
    if word in line:
       for _ in range(re.findall(r"\w+", line).count(word)):
           print("something something")

注意:stderr未被重定向。如果您在没有从stderr=PIPE读取的情况下离开p.stderr,那么如果它在stderr上生成足够的输出以填充其OS管道缓冲区,则该过程可能永远阻塞。请参阅this answer if you want to get both stdout/stderr separately in the unlimited case