在不打印到控制台的情况下获取系统ping的输出


问题内容

我想ping从Python调用并获取输出。我尝试了以下方法:

response = os.system("ping "+ "- c")

但是,这会打印到控制台,我不需要。

PING 10.10.0.100 (10.10.0.100) 56(86) bytes of data.
64 bytes from 10.10.0.100: icmp_seq=1 ttl=63 time=0.713 ms
64 bytes from 10.10.0.100: icmp_seq=2 ttl=63 time=1.15 ms

有没有一种方法可以不打印到控制台而仅获得结果?


问题答案:

要获取命令的输出,请使用subprocess.check_output。如果命令失败,它将引发错误,因此将其放在一个try块中。

import subprocess

try:
    response = subprocess.check_output(
        ['ping', '-c', '3', '10.10.0.100'],
        stderr=subprocess.STDOUT,  # get all output
        universal_newlines=True  # return string not bytes
    )
except subprocess.CalledProcessError:
    response = None

若要用于ping了解地址是否正在响应,请使用其返回值,该值为0表示成功。
subprocess.check_call如果返回值不为0,则将引发并出错。要抑制输出,请重定向stdoutstderr。使用Python
3,您可以使用subprocess.DEVNULL而不是在一个块中打开空文件。

import os
import subprocess

with open(os.devnull, 'w') as DEVNULL:
    try:
        subprocess.check_call(
            ['ping', '-c', '3', '10.10.0.100'],
            stdout=DEVNULL,  # suppress output
            stderr=DEVNULL
        )
        is_up = True
    except subprocess.CalledProcessError:
        is_up = False

通常,使用subprocess调用(如文档所述)旨在替换os.system