You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:39:39