我正在尝试通过管道传输命令的输出,但在写入端关闭之前,似乎没有数据从管道中读取。最终我希望它连接到一个 websocket,它在执行命令时传输命令的状态。问题在于,虽然此代码逐行打印消息,但在程序完成执行之前它不会打印任何内容。cmd := exec.Command(MY_SCRIPT_LOCATION, args)// create a pipe for the output of the script// TODO pipe stderr toocmdReader, err := cmd.StdoutPipe()if err != nil { fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err) return}scanner := bufio.NewScanner(cmdReader)go func() { for scanner.Scan() { fmt.Printf("\t > %s\n", scanner.Text()) }}()err = cmd.Start()if err != nil { fmt.Fprintln(os.Stderr, "Error starting Cmd", err) return}err = cmd.Wait()if err != nil { fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err) return}有什么办法可以做类似的事情,让扫描仪在写入管道时逐行读取,而不是在所有内容都写入之后?该程序运行大约需要 20 秒,并且有源源不断的更新,因此让它们一次全部通过是很烦人的。
2 回答
料青山看我应如是
TA贡献1772条经验 获得超8个赞
事实证明,问题不在我上面发布的代码中。这按预期工作。问题是正在执行的 C 程序没有正确刷新stdout
。当以交互方式运行它时,它按预期工作,但是当stdout
通过管道传输时,它实际上不会被写入,直到我调用flush
. 在 c 程序中手动添加一些flush 语句后,go 代码按预期工作。
- 2 回答
- 0 关注
- 546 浏览
添加回答
举报
0/150
提交
取消