Python中os.system重定向失效求助:仅写入最后一次ping结果
这个问题我太熟了!你遇到的核心问题是文件重定向的覆盖行为,咱们一步步拆解解决:
问题根源
你在os.system里用了>来重定向ping输出,这个符号的作用是清空并覆盖目标文件。每次循环执行ping命令时,都会把之前的ping.txt内容彻底删掉,只写入当前IP的ping结果——自然最后就只剩最后一次的内容了。
解决方案
方案1:改用追加模式重定向(最简单的修改)
把重定向符号从>改成>>,这个符号会把新内容追加到文件末尾,而不是覆盖:
class Network(object): def __init__(self): pass def pings(self,ip): # 将>替换为>>,实现追加写入 os.system("ping -c 1 {}>>ping.txt".format(ip))
方案2:更稳妥的Python式写法(推荐)
用subprocess模块代替os.system,它能更安全地处理命令执行和输出,还能避免命令行转义的坑,同时手动控制文件的追加逻辑:
import subprocess class Network(object): def __init__(self): pass def pings(self,ip): # 执行ping命令,捕获标准输出和错误输出 result = subprocess.run( ["ping", "-c", "1", ip], capture_output=True, text=True ) # 以追加模式打开文件,写入带标识的结果 with open("ping.txt", "a", encoding="utf-8") as f: f.write(f"=== 检测IP:{ip} ===\n") f.write(result.stdout) f.write(result.stderr) f.write("\n------------------------\n")
额外避坑点:处理IP的换行符
你用readline()读取IP时,会把文件里的换行符\n也读进来,导致ping的是xxx.xxx.xxx.xxx\n这种无效IP,一定要加上strip()去掉空白字符:
if __name__ == "__main__": full = FullPass() with open('switches.txt') as f: # 用with语句自动管理文件关闭,更安全 ip = f.readline().strip() # 去掉换行符和前后空白 while ip != "": full.pings(ip, 'ping.txt') ip = f.readline().strip()
内容的提问来源于stack exchange,提问作者JCstdio
相关产品推荐
相关产品推荐

