Python非阻塞子进程输出读取不捕获所有输出

时间:2016-01-21 19:11:23

标签: python flask gevent gevent-socketio flask-socketio

希望有人可以帮忙解决这个问题:

def non_block_read(output):

    fd = output.fileno()
    fl = fcntl.fcntl(fd, fcntl.F_GETFL)
    fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
    try:
        return output.read()
    except:
        return ''

def trace(stdout):
    while True:
        output = non_block_read(stdout).strip()
        if output:
            defaults.app.logger.info(output)
            defaults.socketio.emit("traceroute", {"Data": output})

tracerouteHost = '127.0.0.1'
hops = data['hops'] if data['hops'] else 32

if re.match('^[a-zA-Z0-9.-]{2,200}$', data['host']):
    tracerouteHost = data['host']


p = Popen(["traceroute", tracerouteHost, "-m", str(hops)], stdout=PIPE, stderr=PIPE)
thread = threading.Thread(target=trace, args=[p.stdout])
thread.daemon = True
thread.start()

问题是这个"出现"工作但traceroute命令的所有输出都不是捕获,只有一部分。

我在网上发现了大部分内容,所以不能完全理解它。

基本上我试图这样做,所以我在后台运行traceroute命令,当我从它输出时,我想把它从我的web套接字(socketio)发送到浏览器。

但我不希望它阻止其他行动。

我使用Python Flask / Gevent,如果这对任何人都有帮助。

0 个答案:

没有答案