我喜欢 Python 的Twisted和Cmd。我想一起使用它们。
我做了一些工作,但到目前为止,我还没有弄清楚如何使制表符完成工作,因为我没有看到如何在 Twisted 的 LineReceiver 中立即(不按 Enter)接收制表符按键事件。
到目前为止,这是我的代码:
#!/usr/bin/env python
from cmd import Cmd
from twisted.internet import reactor
from twisted.internet.stdio import StandardIO
from twisted.protocols.basic import LineReceiver
class CommandProcessor(Cmd):
def do_EOF(self, line):
return True
class LineProcessor(LineReceiver):
from os import linesep as delimiter # makes newline work
def __init__(self):
self.processor = CommandProcessor()
self.setRawMode()
def connectionMade(self):
self.transport.write('>>> ')
def rawDataReceived(self, data):
self.processor.onecmd(data)
self.transport.write('>>> ')
StandardIO(LineProcessor())
reactor.run()
除了制表符完成之外,这有点工作。我可以输入“帮助”之类的命令,然后 Cmd 模块将打印结果。但是我失去了 Cmd 模块的漂亮的制表符完成功能,因为 Twisted 一次缓冲一行。我尝试设置LineProcessor.delimiter
为空字符串,但无济于事。也许我需要找一些其他的 Twisted 来代替 LineReceiver?或者也许有一种更简单的方法可以避免我不得不一个一个地处理每个字符?
我不能单独使用 Cmd,因为我想让它成为一个网络应用程序,其中一些命令将导致发送数据,而从网络接收数据将异步发生(并显示给用户)。
因此,无论我们是从上面的代码还是完全不同的代码开始,我都想用 Python 构建一个漂亮、友好的终端应用程序,它可以响应网络事件以及 tab 补全。我希望我可以使用已经存在的东西,而不必自己实施太多。