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

标签 python twisted minecraft

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

假设我想获取一个非常具体的命令的结果(“list”命令,它返回如下内容:

[INFO] Connected players: blah, blah2

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

我有一些可能的方法来处理这个问题,但如果有人有想法,我宁愿用“正确的方法”来做到这一点。

最佳答案

首先,永远不要调用writeSomeData。调用write。其次,拥有一个全局协议(protocol)实例可能是一个坏主意,出于所有常见的原因,全局协议(protocol)实例通常是一个坏主意。

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

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不久之后就会显示连接的玩家信息。

关于python - 扭曲的Python+spawnProcess。从命令获取输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6105760/

相关文章:

python - Jupyter Notebook 和 Conda 命令行之间的包不一致

python - 如何使用 scrapy 捕获错误,以便在出现用户超时错误时执行某些操作?

快速的http请求。不通过

python - python 3.5 中的 json.loads 和 Redis

python - 如何为 Pandas 转换 xls 文件?

python - 如何捕获扭曲延迟回调中的异常?

python - 当前的 Python Beanstalkc 客户端实现是非阻塞的吗?

eclipse - 在 Eclipse 中作为 maven 安装运行时如何更改 jar 输出目录?

gradle - 尝试通过build.gradle添加Applied Energistics api

python - 在 Python 3 中加载 Python 2 .npy 文件时出错