去Stdin Stdout沟通

时间:2017-10-25 14:34:47

标签: go stdout stdin

我想执行一个go文件,我将在yaml配置文件中指定并以字节为单位发送它。我怎么能这样做?

我认为我可以将Stdin和Stdout用于此

但无法弄清楚 Yaml配置:

subscribers:
  temp:
    topics:
      - pi/+/temp
    action: ./temp/tempBinary

这是我的代码:

client.Subscribe(NewTopic(a), func(c *Client, msg Message) {
            cmd := exec.Command(v.Action)

            // I actually want to send [msg] to it so it can be used there
            cmd.Stdin = bytes.NewReader(msg.Bytes())

            if err := cmd.Start(); err != nil {
                c.Logger.Infof("Error while executing action: %v", err)
            } else {
                c.Logger.Info("Executed command")
            }

            // I want to handle responses from the called binary
            var out bytes.Buffer
            cmd.Stdout = &out
            c.Logger.Infof("Response: %v", out)
        })

我无法弄清楚我究竟能做到这一点。

1 个答案:

答案 0 :(得分:0)

https://golang.org/pkg/os/exec/#example_Cmd_StdinPiphttps://golang.org/pkg/os/exec/#example_Cmd_StdoutPipehttps://golang.org/pkg/io/ioutil/#example_ReadAll

有一个很好的例子。

一个不错的开始就是:

stdin, err := cmd.StdinPipe()
if err != nil {
    log.Fatal(err)
}
stdout, err := cmd.StdoutPipe()
if err != nil {
    log.Fatal(err)
}
defer stdin.Close()
io.WriteString(stdin, msg.String())

b, err := ioutil.ReadAll(stdout)
if err != nil {
    log.Fatal(err)
}
c.Logger.Infof("Response %s", stdout)

但是这个解决方案甚至没有开始处理边缘情况,例如管道提前关闭等。

此视频可以很好地通过以下内容进行讨论: https://www.youtube.com/watch?v=LHZ2CAZE6Gs&feature=youtu.be&list=PL6