进程协议,延迟和命令行输入

时间:2013-04-10 16:36:12

标签: python twisted

我有一个包装脚本,其中包含一个派生自protocol.ProcessProtocol的类,该类调用外部代码。我想要的是能够通过包装器的命令行与所述代码进行交互。我们的想法是,这个包装器将包装几段代码并为所有代码提供一个(简单的?)统一接口。请注意,此应用程序中无需联网。

我对Twisted很新,但我假设我需要编写一个deferred函数来读取stdin,解析它是为了理智(无论对我的应用程序意味着什么),然后调用{ {1}}。

是否有人知道延迟解析输入命令行的示例?

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

以下是我为后人提出的代码(基于code of Jp Calderone)。

欢迎批评


import os
import tty
import sys
import termios

from pprint import pprint, pformat

from twisted.internet import reactor, stdio
from twisted.python import log

from twisted.conch.insults.insults import ServerProtocol
from twisted.conch.recvline import HistoricRecvLine
from twisted.conch.recvline import RecvLine

try:
    from fabulous.color import fg256
    _format_prompt = lambda x: fg256(63, x).as_utf8
except ImportError:
    _format_prompt = lambda x: x


class Fubar(HistoricRecvLine):

    def connectionLost(self, reason):
        print 'Connection lost because', pformat(reason)
        reactor.stop()

    def lineReceived(self, line):
        if line == "quit" or line == "exit" or line == "q":
            self.terminal.loseConnection()
        self.terminal.write('echo: %s' % (pformat(line)))
        self.terminal.nextLine()
        self.terminal.write(self.ps[self.pn])

    def connectionMade(self):
        """Called after a connection has been established."""
        pprint(self.ps)
        self.ps = (_format_prompt('echo> '), '...')
        RecvLine.connectionMade(self)
        self.historyLines = []
        self.historyPosition = 0
        t = self.terminal
        self.keyHandlers.update({t.UP_ARROW: self.handle_UP,
                                 t.DOWN_ARROW: self.handle_DOWN})


def runWithProtocol(klass):
    fd = sys.__stdin__.fileno()
    oldSettings = termios.tcgetattr(fd)
    tty.setraw(fd)
    try:
        p = ServerProtocol(klass)
        stdio.StandardIO(p)
        reactor.run()
    finally:
        termios.tcsetattr(fd, termios.TCSANOW, oldSettings)
        os.write(fd, "\r\x1bc\r")


def main(argv=None):
    log.startLogging(file('child.log', 'w'))
    runWithProtocol(Fubar)


if __name__ == '__main__':
    main()