获取系统ping输出而不打印到控制台

时间:2015-02-27 15:50:01

标签: python

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

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

有没有办法不打印到控制台,只是得到结果?

2 个答案:

答案 0 :(得分:9)

要获取命令的输出,请使用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表示成功。如果返回值不为0,subprocess.check_call将引发错误。要抑制输出,请重定向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

答案 1 :(得分:5)

如果您只需要检查ping是否成功,请查看状态代码; ping返回2表示失败,0表示成功。

我使用subprocess.Popen()(以及 subprocess.check_call(),因为当ping报告主机关闭时,会引发异常,从而使处理变得复杂)。将stdout重定向到管道,以便您可以从Python中读取它:

ipaddress = '198.252.206.140'  # guess who
proc = subprocess.Popen(
    ['ping', '-c', '3', ipaddress],
    stdout=subprocess.PIPE)
stdout, stderr = proc.communicate()
if proc.returncode == 0:
    print('{} is UP'.format(ipaddress))
    print('ping output:')
    print(stdout.decode('ASCII'))

如果要忽略输出,可以切换到subprocess.DEVNULL * ;使用proc.wait()等待ping退出;您可以添加-qping做更少的工作,因为它会使用该开关产生较少的输出:

proc = subprocess.Popen(
    ['ping', '-q', '-c', '3', ipaddress],
    stdout=subprocess.DEVNULL)
proc.wait()
if proc.returncode == 0:
    print('{} is UP'.format(ipaddress))

在这两种情况下,proc.returncode可以告诉您更多有关ping失败的原因,具体取决于您的ping实施。有关详细信息,请参阅man ping。在OS X上,联机帮助页指出:

EXIT STATUS
     The ping utility exits with one of the following values:

     0       At least one response was heard from the specified host.

     2       The transmission was successful but no responses were received.

     any other value
             An error occurred.  These values are defined in <sysexits.h>.

man sysexits列出了更多错误代码。

后一种形式(忽略输出)可以使用subprocess.call()简化,os.devnull valueproc.wait()proc.returncode返回结合起来:

status = subprocess.call(
    ['ping', '-q', '-c', '3', ipaddress],
    stdout=subprocess.DEVNULL)
if status == 0:
    print('{} is UP'.format(ipaddress))

* subprocess.DEVNULL是Python 3.3中的新功能;在旧版Python中使用open(os.devnull, 'wb'),使用{{3}},例如:

status = subprocess.call(
    ['ping', '-q', '-c', '3', ipaddress],
    stdout=open(os.devnull, 'wb'))