gpt4 book ai didi

go - 实时从 command exec 捕获 stdout

转载 作者:IT王子 更新时间:2023-10-29 01:12:17 28 4
gpt4 key购买 nike

我目前正在开发一个可以执行命令的聊天机器人。我希望它做的一件事是能够运行脚本并将脚本的标准输出输出到聊天中。

我遇到的问题是该函数收集脚本的所有标准输出并在最后返回它们,我想尝试修改它以实时写入并且在这样做时遇到了问题。

我认为这个问题可能涉及到它只有一种方法可以将文本返回到聊天 channel ,那就是通过重启的返回功能。但是,我想遍历 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()))
}

最佳答案

redis.log 的实时命令管道。 (你可以调用bgsave来测试它。)

package main

import (
"os"
"os/exec"
"fmt"
"bufio"
)

func main() {
cmd := exec.Command("tail", "-f", "/usr/local/var/log/redis.log")

// create a pipe for the output of the script
cmdReader, err := cmd.StdoutPipe()
if err != nil {
fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err)
return
}

scanner := bufio.NewScanner(cmdReader)
go func() {
for scanner.Scan() {
fmt.Printf("\t > %s\n", scanner.Text())
}
}()

err = cmd.Start()
if err != nil {
fmt.Fprintln(os.Stderr, "Error starting Cmd", err)
return
}

err = cmd.Wait()
if err != nil {
fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err)
return
}
}

关于go - 实时从 command exec 捕获 stdout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48353768/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com