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

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

认证0级讲师

Antworte allen(1)
学习ing

你这个命令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)
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage