Я пытаюсь передать потоковую оболочку bash в / из простого пользовательского интерфейса WebSockets, но у меня возникают проблемы с перенаправлением ввода-вывода. Я хочу запустить экземпляр bash и подключить stdout и stdin к функциям write_message () и on_message (), которые взаимодействуют с моим веб-интерфейсом. Вот упрощенная версия того, что я пытаюсь сделать:
class Handler(WebSocketHandler):
def open(self):
print "New connection opened."
self.app = subprocess.Popen(["/bin/bash", "--norc", "-i"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=False)
thread.start_new_thread(self.io_loop, ())
def on_message(self, message):
self.app.stdin.write(message)
def on_close(self):
self.app.terminate()
def io_loop(self):
while self.app.poll() is None:
line = self.app.stdout.readline()
if line:
self.write_message(line)
Несмотря на то, что bash запускается и вызывается on_message, я не получаю никакого вывода. readline () остается блокирующим. Я пробовал stdout.read (), stdout.read (1) и различные модификации буфера, но все еще не выводил. Я также попробовал жестко запрограммировать команды с завершающим символом '\ n' в on_message, чтобы изолировать проблему, но я до сих пор не получаю никакого вывода из readline ().
В идеале я хочу транслировать каждый байт, записанный на стандартный вывод, в режиме реального времени, не ожидая EOL или каких-либо других символов, но мне трудно найти правильный API. Любые указатели будут оценены.