扭曲的Python + spawnProcess从命令获取输出

问题描述

| 我正在用Twisted Python服务器包装minecraft服务器应用程序,该服务器具有RESTful API,用于获取当前连接的播放器列表。 Twisted应用程序通过reactor.spawnProcess()启动minecraft服务器,然后通过Processtransport进行通信,该过程将写入stdin。读取stdout和stdin由单独的protocol.Processprotocol类处理。 鉴于我想获得一个非常特定的命令(\'list \'命令,它返回类似以下内容的命令)的结果:
[INFO] Connected players: blah,blah2
如果我能够在stdout中挑选出玩家列表行,那么将其传递到要求连接玩家列表的RESTful API视图的最佳方法是什么?请记住,我的标准输出阅读器无法直接与试图获取已连接播放器列表的功能进行通信。我可以解析stdout并标识要传送的播放器列表,但我不确定如何将其传送到Web API视图,该视图会将已连接的播放器列表发送到客户端,因为该视图和stdout读取器不是直接联系。 我有几种可能的解决方法,但是如果有人有想法,我宁愿以“正确的方法”来做。     

解决方法

首先,永远不要叫
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)
现在,任何引用了已连接的ѭ5的代码都可以在其上调用ѭ6并取回ѭ7,此后不久该信息将随所连接的播放器信息一起触发。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...