如何在 python 3 中循环/测试多行 shell 子进程输出?

分享于2022年07月16日 python-3.x 问答
【问题标题】:How to loop over/test multi-line shell subprocess output in python 3?如何在 python 3 中循环/测试多行 shell 子进程输出?
【发布时间】:2022-07-16 08:08:51
【问题描述】:

我正在尝试使用 nmap 来确定主机是否在线。我想测试 nmap 输出中的文本 seems down 。我偶然发现了几个示例,这些示例显示了如何执行此操作,但它们似乎专门针对 python2,因为它们在 python3(3.9.2)中运行时会产生错误。这是我下面的刺。有没有办法将其更改为使用简单的字符串比较而不是比较 bytes 中的内容?

#!/usr/bin/python3

import subprocess

ip_addr="10.14.14.22"
p1 = subprocess.Popen (["/usr/bin/nmap", ip_addr, "-p", "U:53,111,137,T:21-25,80,81,82,111,443,139,8080,8006,5666,S:9"], stdout=subprocess.PIPE)

for line in p1.stdout:
    if b'seems down' in line:
        print ("line: " + str(line))


【解决方案1】:

使用 text=True 选项,它是在python 3.7 版本中添加的。 当你做 text=True 时,python以文本模式与子进程通信。

#!/usr/bin/python3
import subprocess

ip_addr="10.14.14.22"
p1 = subprocess.Popen (["/usr/bin/nmap", ip_addr, "-p", "U:53,111,137,T:21-25,80,81,82,111,443,139,8080,8006,5666,S:9"], stdout=subprocess.PIPE,text=True)

for line in p1.stdout:
    if 'seems down' in line:
        print ("line: " + str(line))

【讨论】: