Obtenga salida de ping del sistema sin imprimir en la consola

Quiero llamar a ping desde Python y obtener la salida. Intenté lo siguiente:

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

Sin embargo, esto se imprime en la consola, que no quiero.

 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 

¿Hay alguna forma de no imprimir en la consola y obtener el resultado?

Para obtener la salida de un comando, use subprocess.check_output . Provoca un error si el comando falla, así que rodéelo en un bloque de 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 

Para usar ping para saber si una dirección está respondiendo, use su valor de retorno, que es 0 para el éxito. subprocess.check_call generará un error si el valor de retorno no es 0. Para suprimir la salida, redirija stdout y stderr . Con Python 3 puede usar subprocess.DEVNULL lugar de abrir el archivo nulo en un bloque.

 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 

En general, utilice llamadas de subprocess , que, como describen los documentos, están destinadas a reemplazar os.system .

Si solo necesita verificar si el ping fue exitoso, mire el código de estado; ping devuelve 2 para un ping fallido, 0 para un éxito.

Usaría subprocess.Popen() (y no subprocess.check_call() ya que genera una excepción cuando ping informa que el host está inactivo, lo que complica el manejo). Redirigir stdout a una tubería para que pueda leerlo desde 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')) 

Puede cambiar a subprocess.DEVNULL * si desea ignorar la salida; use proc.wait() para esperar a que salga el ping ; puede agregar -q para que ping haga menos trabajo, ya que producirá menos salida con ese interruptor:

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

En ambos casos, proc.returncode puede proc.returncode más información sobre por qué falló el ping, dependiendo de su implementación de ping . Ver man ping para más detalles. En OS X la página de manual dice:

 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 . 

y man sysexits lista otros códigos de error.

La última forma (ignorando la salida) se puede simplificar utilizando subprocess.call() , que combina proc.wait() con un retorno de proc.returncode :

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

* subprocess.DEVNULL es nuevo en Python 3.3; use open(os.devnull, 'wb') en su lugar en versiones anteriores de Python, haciendo uso del valor os.devnull , por ejemplo:

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