Python subprocess执行ping命令正常响应但始终返回False问题
问题原因
你始终得到False返回值的核心原因是函数返回逻辑错误,和ping命令本身、系统环境无关:
- 从你贴的运行输出可以确认,脚本调用的ping命令已经正常执行,2个探测包全部收到、0丢包,网络连通性没有问题
- 你的
myping函数没有基于ping命令的执行结果做正确的返回判断:subprocess.run()返回的是CompletedProcess对象,直接判断这个对象本身、或者判断它的stdout属性(尤其是你配置了stdout=subprocess.DEVNULL时,stdout属性值为None,布尔判断结果为False),都不能得到正确的连通性结果 - Linux系统中ping命令的执行结果通过进程退出码标识:探测成功(无丢包)时退出码为
0,探测失败(不通、丢包)时退出码为非0值,你没有读取这个退出码做判断。
修复方案
修改函数逻辑,显式读取ping命令的退出码做判断,修复后代码如下:
import subprocess def myping(host): print(f"pinging {host}") response = subprocess.run( ["ping", "-c", "2", host], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT ) # 退出码为0代表ping通,返回True;否则返回False return response.returncode == 0 print(myping("10.21.30.2"))
可选优化
如果需要避免异常场景下ping命令长时间挂住,可以增加超时参数:
# -w 3 代表整个ping操作总超时时间为3秒 response = subprocess.run( ["ping", "-c", "2", "-w", "3", host], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT )
内容的提问来源于stack exchange,提问作者user2236794
相关产品推荐
相关产品推荐

