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 ?
PHP中文网
PHP中文网 2017-06-12 09:21:16
0
1
1272

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中文网

认证0级讲师

répondre à tous(1)
学习ing

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)
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal