2017-10-25 10 views
0

私はyaml設定ファイルで指定するgoファイルを実行し、構造体にバイト単位で送信します。どうすればこのことができますか?Go 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) 
     }) 

Iどのように私はこれを行うことができるかを把握することはできません。

+0

Message.Bytesの実装を探していますか?すべてのメッセージを表すことができるすべてのエンコーディングが行います。 [the encoding/* packages](https://golang.org/pkg/encoding/#pkg-subdirectories)を参照してください。一般的な選択肢は、encoding/jsonとencoding/gobです。 – Peter

+0

2番目の考えでは、エンコーディング/ゴブはすべてのアクションがGoプログラムである場合にのみ有用です。 – Peter

答えて

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

関連する問題