Maison  >  Questions et réponses  >  le corps du texte

python - Après que subprocess.Popen ait exécuté la commande, les informations reçues par stdout.read() sont vides. Est-ce dû à un problème de routage ou à son propre programme ?

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()

PHP中文网PHP中文网2686 Il y a quelques jours1208

répondre à tous(1)je répondrai

  • 学习ing

    学习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)

    répondre
    0
  • Annulerrépondre