首页  >  问答  >  正文

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

PHP中文网PHP中文网2686 天前1211

全部回复(1)我来回复

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

    回复
    0
  • 取消回复