gpt4 book ai didi

go - 如何在Golang中使用os/exec处理用户输入?我无法停止输入阶段

转载 作者:行者123 更新时间:2023-12-01 21:25:28 25 4
gpt4 key购买 nike

首先,我从中构建一个命令为exec.exe:

package main
import "fmt"
func main() {
var input string
fmt.Println("input a value")
fmt.Scanln(&input)
fmt.Println(input)

fmt.Println("input another value")
fmt.Scanln(&input)
fmt.Println(input)
}

然后我想使用os/exec pacage运行它:

package main

import (
"fmt"
"os/exec"
)

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)
}
stdin.Write([]byte("hello"))
var buf = make([]byte, 512)
n, e := stdout.Read(buf)
if e != nil {
panic(e)
}
fmt.Println(string(buf[:n]))

if e := cmd.Wait(); e != nil {
panic(e)
}
}

最后,我运行它,结果将在用户输入阶段暂停,例如:

(如果未加载图片,则它们会在输入阶段暂停)

please input a value:

1
12
232

unexpected result, pausing on user input stage

我是否以错误的方式使用了cmd管道?

最佳答案

该程序正在阻塞,因为子进程中的fmt.Scanln正在等待\n字符(EOF也将使其返回)。为了避免阻塞,您的输入应包括两个\n,或者您可以仅调用“stdin.Close()”来指示输入流已完成。

而且,由于子进程多次调用ScanlnPrintln,因此单次调用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)
}
}

关于go - 如何在Golang中使用os/exec处理用户输入?我无法停止输入阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57780756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com