Go subprocess communication
GO:有没有办法与子进程(shell脚本/ python脚本)进行通信,它正在等待stdin上的输入?
例如 python脚本(子进程)
1 2 3 4 | import sys while True: sys.stdout.write('%s '%eval(sys.stdin.readline())) |
在go程序中,我想创建这个python脚本的子进程,并在必要时重复地在其stdin上提供输入,并获取其输出。 在Go程序的stdout上写或从文件读/写也可以。
这大致是我正在尝试的,但没有任何反应 -
1 2 3 4 5 6 | c := exec.Command("python","-u add.py") si,_ := c.StdinPipe() so,_ := c.StdoutPipe() c.Start() si.Write([]byte("2+2 ") |
这是你的代码的工作版本(python代码没有变化)。
注意:检查所有错误,修复
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import ( "bufio" "fmt" "log" "os/exec" ) func main() { c := exec.Command("python","-u","add.py") si, err := c.StdinPipe() if err != nil { log.Fatal(err) } so, err := c.StdoutPipe() if err != nil { log.Fatal(err) } reader := bufio.NewReader(so) err = c.Start() if err != nil { log.Fatal(err) } // Now do some maths for i := 0; i < 10; i++ { sum := fmt.Sprintf("2+%d ", i) _, err = si.Write([]byte(sum)) if err != nil { log.Fatal(err) } answer, err := reader.ReadString(' ') if err != nil { log.Fatal(err) } fmt.Printf("Answer to %q is %q ", sum, answer) } // Close the input and wait for exit si.Close() so.Close() c.Wait() } |
哪个产生
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | Answer to"2+0 " is"2 " Answer to"2+1 " is"3 " Answer to"2+2 " is"4 " Answer to"2+3 " is"5 " Answer to"2+4 " is"6 " Answer to"2+5 " is"7 " Answer to"2+6 " is"8 " Answer to"2+7 " is"9 " Answer to"2+8 " is"10 " Answer to"2+9 " is"11 " |