【问题标题】:Twisted Python + spawnProcess. Getting output from a command扭曲的 Python + spawnProcess。从命令中获取输出
【发布时间】:2011-05-24 04:42:12
【问题描述】:

我正在使用 Twisted Python 服务器包装 Minecraft 服务器应用程序,该服务器具有用于获取当前连接玩家列表的 RESTful API。 Twisted 应用程序通过reactor.spawnProcess() 启动我的世界服务器,然后通过ProcessTransport 进行通信,该ProcessTransport 写入标准输入。读取标准输出和标准输入由单独的protocol.ProcessProtocol 类处理。

鉴于我想获得一个非常具体的命令的结果('list' 命令,它返回如下内容:

[INFO] Connected players: blah, blah2

如果我能够在标准输出中挑选出玩家列表行,那么将其传递到要求连接玩家列表的 RESTful API 视图的最佳方式是什么?请记住,我的stdout reader 无法直接与function that is trying to get the list of connected players 通信。我可以解析标准输出并识别要交付的播放器列表,我只是不确定如何将其交付到将连接的播放器列表发送到客户端的 Web API 视图,因为视图和标准输出读取器不是直接的联系方式。

我有一些可行的方法来处理这个问题,但如果有人有想法,我宁愿以“正确的方式”做这件事。

【问题讨论】:

    标签: python twisted minecraft


    【解决方案1】:

    首先,永远不要打电话给writeSomeData。致电write。其次,拥有一个全局协议实例可能是个坏主意,出于所有常见原因,全局变量通常是个坏主意。

    第三,在ProcessProtocol子类中添加一个方法来获取你想要的信息。该协议的工作是知道如何将抽象动作(例如“请求玩家列表”)转换为要传输的字节序列,以及如何将接收到的字节序列转换回抽象动作,例如“过程告诉我这些玩家已连接”。

    class NotchianProcessProtocol(protocol.ProcessProtocol):
        ...
        def listPlayers(self):
            self.transport.write("list")
            self._waiting.append(Deferred())
            return self._waiting[-1]
    
        def outReceived(self, bytes):
            outbuffer = self.outbuffer + bytes
            lines, leftover = parseLines(outbuffer)
            self.outbuffer = leftover
    
            for line in lines:
                if line.startswith('[INFO] Connected players: '):
                    self._waiting.pop(0).callback(line)
    

    现在您的任何引用已连接的NotchianProcessProtocol 的代码都可以调用listPlayers 并取回Deferred,该Deferred 将在不久之后触发连接的玩家信息。

    【讨论】:

    • 感谢您的帮助,我想有一些更好的方法可以做到这一点。我的大脑还没有完全包裹住我们 Twisted 的回调,但这看起来很准确。
    • 哦,self._waiting 到底是什么?翻阅文档时没有看到这个。
    • 看起来像一个列表 :) 我省略了它的初始化——不过它是这个例子的一部分,不是 Twisted 或 ProcessProtocol 提供的东西。
    • 很抱歉再次出现错误,但是 parseLines() 到底在做什么?我猜它是将输出缓冲区分成几行,但剩下的部分是什么?
    • outbuffer 可能是“一些随机垃圾\n[INFO] Connected playe”。您还不想使用 [INFO] 部分,因为它不完整,但您也不想丢弃它,因为最终它会很有用。所以剩下的留到以后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2017-12-15
    • 2023-04-08
    • 1970-01-01
    • 2020-03-25
    • 2021-11-10
    相关资源
    最近更新 更多