【发布时间】:2018-01-24 01:44:09
【问题描述】:
我目前正在开发一个可以执行命令的聊天机器人。我希望它做的一件事是能够运行脚本并将脚本的标准输出输出到聊天中。
我遇到的问题是该函数收集脚本的所有标准输出并在最后返回它们,我想尝试修改它以实时编写并且在这样做时遇到了问题。
我认为这个问题可能涉及到它只有一种方法可以将文本返回到聊天频道,那就是通过重启的返回功能。但是,如果可能,我想遍历 exec 命令并输出。
这是我的代码:
func reboot(command *bot.Cmd) (string, error) {
n := command.Args[0]
// this return is what all gets sent into chat channel
return runcommand(n), nil
}
func runcommand(server string) string {
cmd := exec.Command("/bin/bash", "-c", "python test.py %s", server)
cmdOutput := &bytes.Buffer{}
cmd.Stdout = cmdOutput
err := cmd.Run()
if err !=nil {
os.Stderr.WriteString(err.Error())
}
return fmt.Sprintf(string(cmdOutput.Bytes()))
}
【问题讨论】:
-
您需要更改
reboot来启动一个启动命令的goroutine。您可以传递通道之类的东西,或者只是传递io.Reader(例如:StdoutPipe 的输出)。这应该足以让您入门。 -
我删除了我的答案,因为它没有解决您的问题。我尝试通过多种方式解决它,但所有不直接写入标准输出的方法似乎都缓冲了输出。
-
尝试运行
python -u test.py。默认情况下,Python 输出是缓冲的,可能会在您的情况下导致问题(特别是如果您的输出很短)。 -
@ArmanOrdookhani 成功了!谢谢!
-
@Blooze 不客气 :)
标签: go