我想从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
有没有办法不打印到控制台,只是得到结果?
答案 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
将引发错误。要抑制输出,请重定向stdout
和stderr
。使用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
退出;您可以添加-q
让ping
做更少的工作,因为它会使用该开关产生较少的输出:
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
value将proc.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'))