suchen

Heim  >  Fragen und Antworten  >  Hauptteil

python - Nachdem subprocess.Popen den Befehl ausgeführt hat, sind die von stdout.read() empfangenen Informationen leer. Liegt es am Routing oder an einem eigenen Programmproblem?

Den folgenden Code verwende ich täglich, um die Netzwerkkonnektivität zu überwachen. Die zurückgegebenen Informationen konnten vorgestern abgerufen werden (Stand vorgestern), aber der von stdout.read() ab gestern gelesene Inhalt war leer. Die von mir im CMD-Fenster direkt an den Host zurückgegebenen Informationen sind China Unicom, und die mithilfe der Aufrufmethode erhaltenen Rückgabeinformationen sind ebenfalls normal. Bitte helfen Sie mir, meine Zweifel auszuräumen

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中文网2748 Tage vor1259

Antworte allen(1)Ich werde antworten

  • 学习ing

    学习ing2017-06-12 09:23:16

    你这个命令ping 10.9.88.69 在linux环境下是不会停止的,
    而且subprocess.Popen默认是等待命令结束才返回结果,是阻塞的

    可以这样

    1.让ping早点结束 加多个以参数 -c 指定下ping的次数

    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.把阻塞变为不阻塞

    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)

    Antwort
    0
  • StornierenAntwort