python - subprocess.Popen执行命令后stdout.read()到的信息为空,是路由原因还是自身程序问题?
问题描述
下面的代码是我日常用来监测网络联通性的,昨天之前(截止到前天晚上)都可以获取到返回的信息,而昨天开始stdout.read()读到的内容就是空。 我直接在CMD窗口ping主机返回的信息是联通的,用call方法取到的返回信息也正常。请大神帮忙解惑
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()
问题解答
回答1:你这个命令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 osimport timeimport fcntlimport subprocesscmd = ’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)
