为了账号安全,请及时绑定邮箱和手机立即绑定

从子进程读取 Stdout

从子进程读取 Stdout

Go
慕尼黑8549860 2021-09-10 10:55:36
我正在尝试从 Golang 生成一个子进程。目标是逐行读取和处理输入。这是我试图开始工作的内容:func readStuff(scanner *bufio.Scanner) {    for scanner.Scan() {        fmt.Println("Performed Scan")        fmt.Println(scanner.Text())    }    if err := scanner.Err(); err != nil {        fmt.Fprintln(os.Stderr, "reading standard input:", err)    }}func main() {    cmd := exec.Command("/usr/local/bin/pocketsphinx_continuous", "-inmic", "yes")    out, err := cmd.StdoutPipe()    err = cmd.Start()    checkError(err)    scanner := bufio.NewScanner(out)    fmt.Println("Scanner created")    defer cmd.Wait()    go readStuff(scanner)}在此示例中,打印了“已创建扫描仪”,但之后没有任何反应。但是,运行此命令确实会导致我期望打印到的内容:/usr/local/bin/pocketsphinx_continuous -inmic yes 1>out.txt并修改代码以直接复制到stdout工作以及:cmd := exec.Command("/usr/local/bin/pocketsphinx_continuous", "-inmic", "yes")cmd.Stdout = os.Stdout我错过了什么让我无法阅读输出?
查看完整描述

3 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

您可能需要检查多项内容。


cmd.StdoutPipe()不检查由 返回的错误代码。它应该是。


该pocketsphinx_continuous命令需要提供-hmm和-dict参数。否则,它将失败,并且所有输出实际上都发送到stderr而不是stdout。在这里,您只阅读stdout,但没有什么可阅读的。


cmd.Wait()在确定所有数据都已从 中读取之前,您不应调用stdout。结果是不确定的(实际上,这是一个竞争条件)。检查有关os/exec包的文档。如果绝对需要在 goroutine 中进行解析,则需要在cmd.Wait()调用前与 goroutine 的末尾同步。例如,您可以将函数编写为:


func readStuff(scanner *bufio.Scanner, stop chan bool) {

    // Scanning code

    // ...

    stop<-true

}

和主要代码为:


stop := make(chan bool)

go readStuff(scanner,stop)

<-stop

cmd.Wait()


查看完整回答
反对 回复 2021-09-10
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

看来你不需要

go readStuff(scanner)

因为

cmd.Start()

做系统 fork 本身就这么简单

readStuff(scanner)

对我来说就足够了(不会为此产生 gorouting)


查看完整回答
反对 回复 2021-09-10
  • 3 回答
  • 0 关注
  • 265 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信