Витой Питон + spawnProcess.Получение вывода из команды - PullRequest
1 голос
/ 24 мая 2011

Я работаю над тем, чтобы обернуть серверное приложение Minecraft сервером Twisted Python с RESTful API для получения списка подключенных в данный момент игроков. Приложение Twisted запускает сервер minecraft через pipeline.spawnProcess () , затем связывается через ProcessTransport , который записывает в stdin. Чтение stdout и stdin обрабатывается отдельным протоколом. ProProProtocol class.

Учитывая, что я хочу получить результаты очень определенной команды (команда 'list', которая возвращает что-то вроде этого:

[INFO] Connected players: blah, blah2

Если я могу выбрать строку списка игроков в stdout, каков наилучший способ доставки этого в представление RESTful API, которое запрашивает список подключенных игроков? Помните, что мой читатель стандартного вывода не может напрямую связаться с функцией , которая пытается получить список подключенных игроков . Я могу разобрать стандартный вывод и определить список проигрывателей для доставки, но я просто не уверен, как доставить его в представление веб-API, которое отправит список подключенных проигрывателей клиенту, поскольку представление и средство чтения стандартного вывода не связаны напрямую. контакт.

У меня есть несколько хакерских возможных способов справиться с этим, но я бы предпочел сделать это «правильным способом», если у кого-то есть идеи.

1 Ответ

3 голосов
/ 24 мая 2011

Во-первых, не звоните 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, который вскоре после этого отправит информацию о подключенном игроке.

...