使用subprocess.call执行ping时输出值固定不变的问题求助
问题分析与解决方案
嘿,我一眼就瞅出问题所在了!你现在的代码根本没实时重新执行ping检测——只在最开始跑了一次ping命令,之后循环里只是反复打印第一次的结果,难怪网络状态变了返回值却纹丝不动!
看你这段代码的核心问题:
# 只在循环外执行了一次ping,结果被存在ping变量里 ping = subprocess.call(['ping', '-n', '3','-w', '100', PingAddress]) while True: ping # 这里只是引用之前的旧值,完全没重新检测! print(ping) # ... 后续逻辑
变量ping在循环外只被赋值了一次,不管之后交换机连没断开,这个值都不会更新——相当于你只看了一眼初始状态,之后就一直拿这个旧结果当判断依据。
修正后的代码
把ping命令的调用放进while循环内部,让每次循环都重新执行检测,这样才能拿到实时的网络状态返回值:
import subprocess import time # 加个sleep避免频繁ping,减少网络负载 # 记得初始化这些变量! t = 0 PingAddress = "你的交换机IP地址" # 替换成实际的交换机IP online_msg = "交换机在线 ✅" offline_msg = "交换机离线 ❌" while True: # 每次循环都重新执行ping,获取最新的返回值 ping_result = subprocess.call(['ping', '-n', '3','-w', '100', PingAddress]) print(f"当前ping返回值: {ping_result}") if ping_result != 0 and t < 3: t += 1 print(f"第{t}次检测到离线,重试中...") elif ping_result == 0: t = 0 print(online_msg) else: print(f"连续3次检测离线,{offline_msg}") time.sleep(2) # 每2秒检测一次,可根据需求调整间隔
额外小提示
- 一定要初始化
t变量,不然会抛出未定义的错误 - 添加
time.sleep()可以避免短时间内发送大量ping包,防止对网络造成不必要的压力 - 如果需要排查ping的具体细节(比如丢包情况),可以改用
subprocess.check_output()捕获完整的ping输出内容,方便调试
内容的提问来源于stack exchange,提问作者ineedalife
相关产品推荐
相关产品推荐

