在正则表达式捕获时打印出子进程

时间:2015-03-16 18:42:27

标签: python regex subprocess

我在python中使用以下命令运行bash命令:

proc = subprocess.Popen(cmd)
proc.wait()

此cmd打印输出。但是我不希望它打印,除非它被一些正则表达式捕获。不知道怎么做,因为这是我第一次使用subprocess

4 个答案:

答案 0 :(得分:2)

您也可以将输出直接传递给grep等..:

from subprocess import PIPE, Popen

p = Popen(["ps"], stdout=PIPE)
p2 = Popen(["grep", "chrome"],stdin=p.stdout, stdout=PIPE,universal_newlines=True)
p.stdout.close()

out,err = p2.communicate()
print(out)

 421 ?        00:00:03 chrome
 767 ?        00:00:02 chrome
 843 ?        00:00:04 chrome
 2788 ?        00:52:16 chrome
 2819 ?        00:00:00 chrome-sandbox
 2820 ?        00:00:00 chrome
 2827 ?        00:00:00 chrome-sandbox

答案 1 :(得分:1)

你可以这样做:

proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = proc.communicate()

要查看任何输出/错误,您可以在(out,err)上应用正则表达式,并打印您想要的任何内容。

希望这会有所帮助。

答案 2 :(得分:1)

在简单的情况下,您应该能够使用subprocess.check_output来获取通话结果。在Python3中,它返回一个bytes对象。在Python2中,它像往常一样str

# Python3
result_in_bytes = subprocess.check_output(cmd)
result = result_in_bytes.decode() # -> string

# Python2
result = subprocess.check_output(cmd)

然后你应该能够在该字符串上运行你的正则表达式。

答案 3 :(得分:1)

模拟shell管道:

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

output = Popen("cmd | grep 'pattern'", shell=True,
               stdout=PIPE).communicate()[0]

没有shell:

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

grep = Popen(['grep', 'pattern'], stdin=PIPE, stdout=PIPE)
cmd_process = Popen(['cmd'], stdout=grep.stdin)
output = grep.communicate()[0]
cmd_process.wait()

或者你可以用纯Python过滤cmd的输出:

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

matched_lines = []
cmd_process = Popen(['cmd'], stdout=PIPE)
with cmd_process.stdout:
    for line in iter(cmd_process.stdout.readline, b''):
        if b'pattern' in line: # or re.match(br'pattern', line)
            matched_lines.append(line)
cmd_process.wait()