鱼C论坛

 找回密码
 立即注册
查看: 3081|回复: 15

[已解决]如果ping一个地址并获取它返回值

[复制链接]
发表于 2020-12-4 10:21:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我有这么一个需求,用python去ping一个地址,比如百度,ping通之后,我该怎么获取它的返回值?我要达到 if判断 ping通后执行一段代码,不通又执行另一段代码的效果。

我现在是:
 def Ping():
        command = '"www.baidu.com"'
        os.system(command)

但是这样出来的只会在控制台界面显示
最佳答案
2020-12-4 10:48:48
返回值?你是说命令执行输出的字符串还是退出状态码?用subprocess,命令输出和退出状态码都可以获取。
import subprocess

res = subprocess.Popen(['ping', 'www.baidu.com'], stdout=subprocess.PIPE, universal_newlines=True)

# 命令输出
shuchu, _ = res.communicate()

# 退出状态码
zhuangtaima = res.returncode

print(shuchu, zhuangtaima)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-4 10:31:13 | 显示全部楼层
d:\wp>ping www.baidu.com >1.txt

d:\wp>type 1.txt

正在 Ping www.a.shifen.com [110.242.68.4] 具有 32 字节的数据:
来自 110.242.68.4 的回复: 字节=32 时间=26ms TTL=54
来自 110.242.68.4 的回复: 字节=32 时间=26ms TTL=54
来自 110.242.68.4 的回复: 字节=32 时间=26ms TTL=54
来自 110.242.68.4 的回复: 字节=32 时间=26ms TTL=54

110.242.68.4 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 26ms,最长 = 26ms,平均 = 26ms

d:\wp>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 10:32:57 | 显示全部楼层
wp231957 发表于 2020-12-4 10:31
d:\wp>ping www.baidu.com >1.txt

d:\wp>type 1.txt

我不需要显示上面那些信息,比如ping通了,我就返回,网络连接成功,不通我就返回网络连接失败。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-4 10:35:30 | 显示全部楼层
wnhuiyou 发表于 2020-12-4 10:32
我不需要显示上面那些信息,比如ping通了,我就返回,网络连接成功,不通我就返回网络连接失败。

那需要你自己判断   而且你还要多ping几个网站  才能断定网络是否通畅
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-4 10:36:05 | 显示全部楼层
>>> import subprocess as s
>>> p = s.check_output('ping fishc.com.cn')
>>> print(p.decode(encoding = 'gbk'))


正在 Ping c5jxwwq5xyks84sz2bt78cw71jvphzaw.aliyunwaf.com [101.37.44.185] 具有 32 字节的数据:

来自 101.37.44.185 的回复: 字节=32 时间=32ms TTL=93

来自 101.37.44.185 的回复: 字节=32 时间=32ms TTL=93

来自 101.37.44.185 的回复: 字节=32 时间=32ms TTL=93

来自 101.37.44.185 的回复: 字节=32 时间=32ms TTL=93



101.37.44.185 的 Ping 统计信息:

    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),

往返行程的估计时间(以毫秒为单位):

    最短 = 32ms,最长 = 32ms,平均 = 32ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-4 10:48:48 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
返回值?你是说命令执行输出的字符串还是退出状态码?用subprocess,命令输出和退出状态码都可以获取。
import subprocess

res = subprocess.Popen(['ping', 'www.baidu.com'], stdout=subprocess.PIPE, universal_newlines=True)

# 命令输出
shuchu, _ = res.communicate()

# 退出状态码
zhuangtaima = res.returncode

print(shuchu, zhuangtaima)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 10:49:30 | 显示全部楼层

这里有处问题,就是使用你这段代码 ping一个不通的网址,会耗时很长,一段时间后就报错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 10:50:20 | 显示全部楼层
wp231957 发表于 2020-12-4 10:35
那需要你自己判断   而且你还要多ping几个网站  才能断定网络是否通畅

所以我就想知道下,怎么判断? 判断 文本里面有没有 信息?不会吧..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-4 10:58:18 | 显示全部楼层
wnhuiyou 发表于 2020-12-4 10:50
所以我就想知道下,怎么判断? 判断 文本里面有没有 信息?不会吧..

我目前没啥好办法
比如检测  数据包: 已发送 = 4已接收 = 4,丢失 = 0 (0% 丢失),
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-4 11:01:41 | 显示全部楼层
wnhuiyou 发表于 2020-12-4 10:50
所以我就想知道下,怎么判断? 判断 文本里面有没有 信息?不会吧..

看一下文本里丢失的数量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 11:04:48 | 显示全部楼层
hrp 发表于 2020-12-4 10:48
返回值?你是说命令执行输出的字符串还是退出状态码?用subprocess,命令输出和退出状态码都可以获取。

其实我想要的效果就很简单, 就是测试一下网络连接状态, 通过ping一下固定的IP 如果通了就打印连接成功,不通就打印连接失败 这样用户看了也了解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 11:15:25 | 显示全部楼层
hrp 发表于 2020-12-4 10:48
返回值?你是说命令执行输出的字符串还是退出状态码?用subprocess,命令输出和退出状态码都可以获取。

对了,你这段代码是我想要的效果,返回0和1 但是还想请教下你,ping的话会有一些时间,特别是ping一个网络不通的地址是,要等上十几秒,能不能让它时间缩短?比如ping 就获取一条信息 有返回值就返回0 没有返回值 也就是 请求超时 就返回1 不要等到ping结束后在返回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-4 11:24:59 From FishC Mobile | 显示全部楼层
本帖最后由 hrp 于 2020-12-4 11:29 编辑

communicate方法里加参数timeout=x秒就行,超过timeout秒就退出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-7 15:51:32 | 显示全部楼层
hrp 发表于 2020-12-4 10:48
返回值?你是说命令执行输出的字符串还是退出状态码?用subprocess,命令输出和退出状态码都可以获取。

在请教一下 shuchu, _ = res.communicate()  逗号后面的 _ 下划线表示什么意思呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-7 16:30:06 From FishC Mobile | 显示全部楼层
res.communicate()返回一个含两个元素的元组,相当于 a, b = (1, 2),这时候a得到1,b得到2。现在把b替换成下划线_,说明我只关心a的值,不关心b的值,但又不能只接收a不接收b,所以就用下划线来接收元组的第二个元素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-7 16:30:40 From FishC Mobile | 显示全部楼层
本帖最后由 hrp 于 2020-12-7 16:31 编辑
wnhuiyou 发表于 2020-12-7 15:51
在请教一下 shuchu, _ = res.communicate()  逗号后面的 _ 下划线表示什么意思呀?


res.communicate()返回一个含两个元素的元组,相当于 a, b = (1, 2),这时候a得到1,b得到2。现在把b替换成下划线_,说明我只关心a的值,不关心b的值,但又不能只接收a不接收b,所以就用下划线来接收元组的第二个元素。相当于 a = res.communicate()[0]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 05:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表