小能豆

存储解析后的 ping 值

py

我正在编写一些代码,该代码从 python 执行 ping 操作并使用 awk 仅提取延迟。这是我目前拥有的:

from os import system
l = system("ping -c 1 sitename | awk -F = 'FNR==2 {print substr($4,1,length($4)-3)}'")
print l

调用system()运行正常,但我在终端中得到的是输出,而不是存储在 l 中的值。基本上,我从这个特定的代码块中得到的示例输出是

90.3
0

为什么会发生这种情况?我该如何将该值实际存储到 l 中?这是我正在进行的更大工作的一部分,因此我最好将其保存在原生 Python 中。


阅读 20

收藏
2024-12-10

共1个答案

小能豆

在你当前的代码中,使用 system() 函数执行 shell 命令时,它只是执行该命令并返回命令的退出状态(即 ping 命令的退出码),而不是命令的输出。你希望获取命令的输出并将其存储在 l 变量中。

要捕获命令的输出并将其存储在变量中,你应该使用 subprocess 模块,而不是 os.system(),因为 subprocess 允许你执行命令并获取其标准输出。

使用 subprocess.check_output() 捕获输出

你可以改用 subprocess.check_output() 来执行命令并获取其输出,像这样:

import subprocess

# 执行命令并获取输出
output = subprocess.check_output("ping -c 1 sitename | awk -F = 'FNR==2 {print substr($4,1,length($4)-3)}'", shell=True)

# 解码输出为字符串(默认返回字节对象)
l = output.decode('utf-8').strip()

print(l)

解释:

  1. subprocess.check_output():此函数执行指定的命令,并返回命令的标准输出(stdout),作为字节对象。
  2. shell=True:由于你正在使用管道 (|),需要告诉 subprocess 使用 shell 来解析命令。注意:使用 shell=True 时需要小心,特别是从不可信的源接受输入时,可能会引发安全问题。
  3. decode('utf-8'):将字节对象转换为字符串。
  4. strip():去掉字符串前后的空白字符(例如换行符)。

输出:

如果 ping 命令返回的延迟是 90.3ms,你应该看到输出:

90.3

注意事项:

  • subprocess.check_output() 会抛出 CalledProcessError 如果命令返回一个非零退出状态(例如,ping 命令失败)。你可以使用 try-except 块来处理错误:
try:
    output = subprocess.check_output("ping -c 1 sitename | awk -F = 'FNR==2 {print substr($4,1,length($4)-3)}'", shell=True)
    l = output.decode('utf-8').strip()
    print(l)
except subprocess.CalledProcessError as e:
    print(f"Error executing command: {e}")

这将确保你在命令执行失败时捕获并处理异常。

2024-12-10