Python3.9中subprocess.run的stdout.splitlines()丢失最后一行问题
问题分析与解决
你遇到的问题是因为splitlines()的行为和终端输出的换行处理存在差异,或者ping命令输出的最后一行未以标准换行符结尾,导致遍历splitlines()结果时丢失rtt统计行。以下是几种可行的解决方法:
方案1:改用split('\n')并过滤空行
替换splitlines()为split('\n'),同时过滤掉空行,确保捕获所有有效输出行:
out = subprocess.run(f"ping -c 1 -w 1 {ip_addr}", stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True) print(out.stdout) # 改用split('\n')并过滤空行 for line in out.stdout.split('\n'): stripped_line = line.strip() if stripped_line: print(f'line = {stripped_line}')
方案2:避免使用shell=True(更推荐)
shell=True会引入额外的shell解析步骤,可能引发输出捕获异常。改用列表形式传递命令参数,更安全且能规避此类问题:
out = subprocess.run(['ping', '-c', '1', '-w', '1', ip_addr], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) print(out.stdout) for line in out.stdout.splitlines(): print(f'line = {line}')
方案3:强制补全结尾换行符
如果ping输出的最后一行确实缺少换行符,可以手动为stdout补全换行后再调用splitlines():
out = subprocess.run(f"ping -c 1 -w 1 {ip_addr}", stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True) # 补全结尾换行符 stdout_content = out.stdout + '\n' for line in stdout_content.splitlines(): print(f'line = {line}')
内容的提问来源于stack exchange,提问作者vg6
相关产品推荐
相关产品推荐

