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



我正在尝试使用nmap来确定主机是否在线。我想测试nmap输出中的文本seems down。我偶然发现了几个例子,这些例子显示了如何做到这一点,但似乎它们是专门针对python2的,因为它们在python3(3.9.2)中运行时会产生错误(TypeError: a bytes-like object is required, not 'str')。下面是我的尝试。是否有一种方法可以改变这种工作与一个简单的字符串比较,而不是比较的东西在字节?

#!/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))

使用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))

最新更新