2014-11-19 5 views
0

I가 누른 키, 또는 Popen'd 프로그램에서 제공하는 행 표시 다음 urwid 프로그램 :urwid watch_file 블록의 키

#!/usr/bin/env python 
import urwid 
from threading import Thread 
from subprocess import Popen, PIPE 
import time 
import os 


class MyText(urwid.Text): 
    def __init__(self): 
     super(MyText, self).__init__('Press Q to quit', align='center') 

    def selectable(self): 
     return True 

    def keypress(self, size, key): 
     if key in ['q', 'Q']: 
      raise urwid.ExitMainLoop() 
     else: 
      self.set_text(repr(key)) 


class Writer(object): 
    def __init__(self): 
     self._child = Popen(
       'for i in `seq 5`; do sleep 1; echo $i; done', 
       #"ssh localhost 'for i in `seq 5`; do sleep 1; echo $i; done'", 
       shell=True, stdout=PIPE, stderr=PIPE) 

    def file(self): 
     return self._child.stdout 

    def fileno(self): 
     return self._child.stdout.fileno() 

w = Writer() 
txt = MyText() 
top = urwid.Filler(txt) 
mainloop = urwid.MainLoop(top) 

def on_writer(): 
    c = w.file().read(1) 
    if c == '': # terminated 
     mainloop.remove_watch_file(w.fileno()) 
     return 
    if c == '\n': 
     return 
    txt.set_text(c) 
    mainloop.draw_screen() 

mainloop.watch_file(w.fileno(), on_writer) 

mainloop.run() 

위의 프로그램이 작동을하지만 난는 popen을 변경하는 경우 'd 명령을 실행하면 ssh localhost ... 명령이 완료 될 때까지 키 누르기가 표시되지 않습니다. 왜 그런가요?

환경 : CentOS 6.6, Python 2.7.4, urwid 1.3.1-dev.

답변

0

문제는 ssh가 stdin을 작동 시키려고한다는 것입니다. stdin을 더미 파일 설명자로 설정하면 해결됩니다.

class Writer(object): 
    def __init__(self): 
     r, w = os.pipe() 
     self._child = Popen(
       #'for i in `seq 5`; do sleep 1; echo $i; done', 
       "ssh localhost 'for i in `seq 5`; do sleep 1; echo $i; done'", 
       shell=True, stdin=r, stdout=PIPE, stderr=PIPE) 
     os.close(w)