Obtenir une sortie de système de ping sans impression de la console
Je veux l'appeler ping
à partir de Python et obtenir la sortie. J'ai essayé le suivant:
response = os.system("ping "+ "- c")
Toutefois, cela s'imprime dans la console, que je ne veux pas.
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
Est-il un moyen pour ne pas imprimer de la console et juste obtenir le résultat?
Get ce résultat? Le ping stdout ou le code d'état du processus?
Je veux juste savoir si la machine est en place ou pas.
Que faire si la machine est en place, mais de ne pas répondre au ping?
Je veux juste savoir si la machine est en place ou pas.
Que faire si la machine est en place, mais de ne pas répondre au ping?
OriginalL'auteur pelos | 2015-02-27
Vous devez vous connecter pour publier un commentaire.
Pour obtenir la sortie d'une commande, utilisez
sous-processus.check_output
. Il génère une erreur si la commande échoue, alors l'entourent dans untry
bloc.À utiliser
ping
de savoir si une adresse est de répondre, utiliser sa valeur de retour, qui est 0 en cas de réussite.sous-processus.check_call
va lever et d'erreur si la valeur de retour n'est pas 0. Pour supprimer la sortie, de redirigerstdout
etstderr
. Avec Python 3, vous pouvez utilisersubprocess.DEVNULL
plutôt que d'ouvrir le fichier nul dans un bloc.En général, l'utilisation
subprocess
appels, qui, comme les documents décrivent, sont destinées à remplaceros.system
.OriginalL'auteur davidism
Si vous avez uniquement besoin de vérifier si la commande ping a été un succès, regarde le code de statut;
ping
retourne2
de l'échec d'une table de ping,0
pour un succès.J'utiliserais
sous-processus.Popen()
(et passubprocess.check_call()
comme cela soulève une exception lorsqueping
rapports de l'hôte est en baisse, ce qui complique la manipulation). Redirigerstdout
à un tuyau de sorte que vous pouvez le lire à partir de Python:Vous pouvez passer à
sous-processus.DEVNULL
* si vous souhaitez ignorer la sortie; l'utilisationproc.wait()
attendreping
de sortie; vous pouvez ajouter-q
avoirping
faire moins de travail, comme il va produire moins de sortie avec ce commutateur:Dans les deux cas,
proc.returncode
peut vous en dire plus sur les raisons de l'échec de ping, selon votreping
mise en œuvre. Voirman ping
pour plus de détails. Sur OS X, la page de manuel états:et
man sysexits
listes d'autres codes d'erreur.La dernière forme (en ignorant la sortie) peut être simplifiée par l'utilisation de
sous-processus.call()
, qui combine laproc.wait()
avec unproc.returncode
retour:*
subprocess.DEVNULL
est nouveau en Python 3.3; utilisationopen(os.devnull, 'wb')
à sa place dans les anciennes versions de Python, faisant usage de laos.devnull
valeur, par exemple:argh,
check_call()
soulève elle aussi. De vérifier.Oui, vous pouvez soit le TUYAU ou de la capture de l'erreur, si vous utilisez
call
dans le premier exemple, il fonctionnera comme de juste, elle renvoie le code de retour, peu importe.j'ai eu cette erreur à la fin. Le fichier "/usr/lib64/python2.7/subprocess.py", ligne 11 à 15, dans _get_handles c2pwrite = stdout.fileno() AttributeError: 'str' object n'a pas d'attribut "fileno'
statut = sous-processus.appel( ['ping', '-q', '-c', '3', self.ip_adress], stdout=sous-processus.os.devnull) si statut == 0: return True else: return False
OriginalL'auteur Martijn Pieters