3 回答
TA贡献1809条经验 获得超8个赞
该程序正在阻塞,因为子fmt.Scanln进程中的 正在等待该\n字符(anEOF也会导致它返回)。为了避免阻塞,您的输入应该包含两个\ns,或者您可以只调用“stdin.Close()”来指示输入流已完成。
并且由于子流程多次调用Scanln和Println,因此单次调用stdout.Read可能无法读取子流程的完整输出。您可以继续调用stdout.Read()直到io.EOF返回错误,或者只使用ioutil.ReadAll.
func main() {
cmd := exec.Command("G:\\go_workspace\\GOPATH\\src\\pjx\\modules\\exec\\exec")
stdin, e := cmd.StdinPipe()
if e != nil {
panic(e)
}
stdout, e := cmd.StdoutPipe()
if e != nil {
panic(e)
}
if e := cmd.Start(); e != nil {
panic(e)
}
_, e = stdin.Write([]byte("hello\nworld\n"))
if e != nil {
panic(e)
}
stdin.Close()
out, _ := ioutil.ReadAll(stdout)
// or you can use a loop
//for {
// var buf = make([]byte, 512)
// n, e := stdout.Read(buf)
// if e == io.EOF {
// break
// }
// if e != nil {
// panic(e)
// }
// fmt.Println(string(buf[:n]))
//}
fmt.Println(string(out))
if e := cmd.Wait(); e != nil {
panic(e)
}
}
TA贡献1850条经验 获得超11个赞
一种方法可以做到这一点
cmd := exec.Command("...") // Change to your path
stdin, err := cmd.StdinPipe()
if err != nil {
panic(err)
}
stdout, err := cmd.StdoutPipe()
if err != nil {
panic(err)
}
buf := bytes.NewBuffer(nil)
// read the stdout continuously in a separate goroutine and capture it in buf
go func() {
io.Copy(buf, stdout)
}()
if err := cmd.Start(); err != nil {
panic(err)
}
stdin.Write([]byte("hello\n")) // Send \n to submit
stdin.Write([]byte("world\n"))
if err := cmd.Wait(); err != nil {
panic(err)
}
fmt.Fprint(os.Stdout, buf)
结果:
➜ go run main.go
input a value
hello
input another value
world
TA贡献1757条经验 获得超8个赞
您需要监听正在执行的程序的输出。当您写“hello”时,程序可能仍在写入其标准输出。尝试这个:
go func() {
in := bufio.NewReader(stdout)
for {
s, err := in.ReadString('\n')
if err != nil {
return
}
fmt.Println(s)
}
}()
if e := cmd.Start(); e != nil {
panic(e)
}
stdin.Write([]byte("hello\n"))
stdin.Write([]byte("hello2\n"))
if e := cmd.Wait(); e != nil {
panic(e)
}
- 3 回答
- 0 关注
- 156 浏览
添加回答
举报