Python3中如何遍历测试shell子进程多行输出并做字符串比较
问题根源
Python 3 中subprocess.PIPE默认返回字节(bytes)类型的输出内容,和Python 2默认返回字符串的行为不一致,直接用字符串和字节对象做包含判断就会触发TypeError: a bytes-like object is required, not 'str'报错。要全程使用普通字符串逻辑做匹配,不需要逐行手动转码,在创建子进程时指定输出解码规则即可。
修改方法
给subprocess.Popen传入encoding="utf-8"参数(也可以传text=True,效果是自动按系统默认编码解码输出),配置后迭代p1.stdout拿到的每一行都是原生字符串类型,可直接用字符串做匹配,不需要加b前缀标记字节对象。
修改后的完整代码:
#!/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, encoding="utf-8" ) for line in p1.stdout: if 'seems down' in line: # line本身就是字符串,无需额外调用str()转换 print(f"检测到主机离线,匹配行内容: {line.strip()}")
注意事项
- 若运行环境默认编码不是UTF-8(比如部分精简Linux系统、中文Windows环境),可将
encoding参数替换为环境对应编码值,避免输出乱码。 - 相比逐行对字节内容调用
.decode()的写法,创建子进程时统一指定编码的写法更简洁,也能覆盖标准错误输出的解码场景,减少遗漏。
内容的提问来源于stack exchange,提问作者Nstevens
相关产品推荐
相关产品推荐

