Как заставить Hubot в IRC печатать вывод внешнего скрипта по мере его получения, а не все сразу?

У меня есть экземпляр Hubot, работающий в IRC. Внутри моего каталога скриптов у меня есть несколько coffeescripts, ссылающихся на внешние скрипты python. Моя проблема в том, что у меня есть данные, которые должны распечатываться перед другими данными во внешних сценариях, таких как «Обработка запроса. Пожалуйста, подождите ...» и т. д., и Hubot ждет, пока весь сценарий полностью завершит выполнение, и сразу сбрасывает вывод в IRC. .

Как мне изменить свои coffeescripts для отправки вывода из внешнего сценария по мере его получения?

пример кофейного скрипта:

# Commands:
#   Hubot jira-add-comment <ticket> "comment" - Add given comment to a JIRA ticket

{spawn} = require 'child_process'
module.exports = (robot) ->

addComment = (msg,ticket,comment) -> 
    output = spawn "/path/to/externalscript.py", [ticket,comment]
    output.stdout.on 'data', (data) ->
        msg.send data.toString()

robot.respond /jira-add-comment (\w+-\d+) (.+)$/i, (msg) ->
    addComment(msg,msg.match[1].trim(),msg.match[2])

Спасибо!


person Ryan Peters    schedule 24.02.2014    source источник
comment
Я тоже очень любопытен в этом. Было бы неплохо, если бы он мог кэшировать все.   -  person JJ Asghar    schedule 25.02.2014


Ответы (2)


У меня была такая же проблема. Решение состояло в том, чтобы передать флаг «-u» в Python при вызове скрипта Python из Hubot.

s = spawn 'python', ['-u', '/your/script/here.py', 'any_other_flags']

https://unix.stackexchange.com/questions/182537/write-python-stdout-to-file-immediately

person David Carriger    schedule 14.07.2015

Может ли это быть из-за плохой идентификации в вашем примере сценария?

output.stdout.on 'data', (data) ->
msg.send data.toString()

Должно быть:

output.stdout.on 'data', (data) ->
    msg.send data.toString()
person Spajus    schedule 26.02.2014
comment
Извините, это была ошибка с моей стороны при копировании и вставке. Coffeescript имеет правильный отступ. Я обновил код выше. - person Ryan Peters; 03.03.2014