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

“实时”从 `exec.Cmd` 获取输出

“实时”从 `exec.Cmd` 获取输出

Go
天涯尽头无女友 2021-10-18 14:10:58
这个问题类似于Golang - Copy Exec output to Log除了它涉及exec命令输出的缓冲。我有以下测试程序:package mainimport (    "fmt"    "log"    "os/exec")func main() {    cmd := exec.Command("python", "inf_loop.py")    var out outstream    cmd.Stdout = out    if err := cmd.Start(); err != nil {        log.Fatal(err)    }    fmt.Println(cmd.Wait())}type outstream struct{}func (out outstream) Write(p []byte) (int, error) {    fmt.Println(string(p))    return len(p), nil}inf_loop.py,上面提到的,只包含:print "hello"while True:    passgo 程序在我运行时挂起并且不输出任何内容,但是如果我使用os.Stdout而不是out它在挂起之前输出“hello”。为什么两个io.Writers之间存在差异,如何修复?更多诊断信息:当循环被移除时inf_loop.py,正如预期的那样,两个程序都会输出“hello”。当yes作为程序而不是python脚本使用并输出时len(p),outstream.Write有输出,输出通常是16384或32768。这向我表明这是一个缓冲问题,正如我最初预期的那样,但我还是不明白为什么outstream结构被缓冲阻塞但os.Stdout不是。一种可能性是该行为是将直接exec传递给的方式的结果,如果它是一个(有关详细信息,请参阅源代码),否则它会在进程和 之间创建一个,并且该管道可能会导致缓冲。但是, 的操作和可能的缓冲对我来说太低级了,无法调查。io.Writeros.StartProcessos.Fileos.Pipe()io.Writeros.Pipe()
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 297 浏览
慕课专栏
更多

添加回答

举报

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