誰かがこれを手伝ってくれることを願っています:
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を使用しています。