Maison > Questions et réponses > le corps du texte
Le code ci-dessous est ce que j'utilise quotidiennement pour surveiller la connectivité réseau. Les informations renvoyées ont pu être obtenues avant hier (avant-hier), mais le contenu lu par stdout.read() à partir d'hier était vide. Les informations renvoyées par moi en pingant directement l'hôte dans la fenêtre CMD sont China Unicom, et les informations de retour obtenues en utilisant la méthode d'appel sont également normales. S'il vous plaît, aidez-moi à résoudre mes doutes
cmd='ping 10.9.88.69'
P=subpross.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
reshult=p.stdout.read()
学习ing2017-06-12 09:23:16
Votre commande ping 10.9.88.69 ne s'arrêtera pas dans l'environnement Linux,
Et subprocess.Popen attend par défaut la fin de la commande avant de renvoyer le résultat, ce qui bloque
Ça peut être comme ça
1. Laissez le ping se terminer plus tôt. Ajoutez le paramètre -c pour spécifier le nombre de pings
.cmd='ping 10.9.88.69 -c 3'
P=subpross.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
reshult=p.stdout.read()
2. Changez le blocage en non bloquant
import os
import time
import fcntl
import subprocess
cmd = 'ping 10.9.88.69'
p = subprocess.Popen(cmd,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,shell=True)
fd = p.stdout.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
while True:
try:
line = p.stdout.readline()
print(line)
except:
time.sleep(1)