首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >urwid watch_file块按键

urwid watch_file块按键
EN

Stack Overflow用户
提问于 2014-11-20 01:10:21
回答 1查看 333关注 0票数 0

我有以下urwid程序,它显示按下的键或来自Popen'd程序的任何行:

代码语言:javascript
复制
#!/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 ...版本,程序将停止显示按键,直到ssh localhost ...命令结束。为什么会这样呢?

环境:Python6.6,CentOS 2.7.4,urwid 1.3.1-dev。

EN

回答 1

Stack Overflow用户

发布于 2014-11-20 01:55:55

问题是ssh试图操作它的stdin。将其stdin设置为虚拟文件描述符可以解决此问题。

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27022810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档