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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:47:31