我想执行一个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)
})
我无法弄清楚我究竟能做到这一点。
答案 0 :(得分:0)
https://golang.org/pkg/os/exec/#example_Cmd_StdinPip,https://golang.org/pkg/os/exec/#example_Cmd_StdoutPipe和https://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