golang 操作系统/exec : get data from stdout in parts

标签 go

我想使用 os/exec 从我的 go 代码运行一个外部应用程序。应用程序 my_external_script.sh 分两部分将数据输出到 stdout:第一部分非常快(三秒后将“A”写入 stdout),第二部分( "B) 仅在 10 秒后写入。

例如:

./my_external_script.sh
.....
.....
A (3 seconds elapsed)
.....
.....
.....
.....
.....
.....
B (10 seconds elapsed)
(program exits with 0 status code)

我目前正在从我的 go 代码中这样执行:

func execMyExternalCmd() (*string, error) {
    cmd := exec.Command("my_external_script.sh")
    var out bytes.Buffer
    cmd.Stdout = &out
    err := cmd.Run()
    if err != nil {
        return nil, err
    }
    var res = out.String()
    return &res, nil
}

问题是,execMyExternalCmd 只会在 10 秒后返回,此时“A”和“B”都已写入,程序退出。我想在 stdout 上可用时立即使用“A”(但稍后也可以在可用时使用“B”)。我怎样才能做到这一点?

最佳答案

package main

import (
    "bufio"
    "log"
    "os/exec"
)

func main() {
    cmd := exec.Command("sh", "-c", "echo 1;sleep 10;echo 2;")

    outPipe, _ := cmd.StdoutPipe()
    scanner := bufio.NewScanner(outPipe)

    go func() {
        for scanner.Scan() {
            log.Println(scanner.Text())
        }
    }()

    cmd.Start()
    cmd.Wait()

    log.Println("Done")
}

输出:

2016/12/04 17:11:09 1
2016/12/04 17:11:19 2
2016/12/04 17:11:19 Done

使用 channel 从函数发送数据而不是返回。

关于golang 操作系统/exec : get data from stdout in parts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40958903/

相关文章:

google-app-engine - `go build -mod vendor` 无法使用 vendored 包

pointers - Go:通过指针删除对象

json - 如何使用 Swagger 2.0 或 OpenApi 3.x 在 API 对象中指定 "JSON Raw Message"?

go - 通过 Go 中的自定义 io.Writer 编辑敏感数据

go - 修复 go 使用的工具版本

arrays - 为什么在 Go 中调用可变参数函数时不能_直接_使用数组?

go - 为什么golang中的关键字范围适用于2d slice ?

go - 如何使用conn.read()读取横幅

google-app-engine - 将结构 slice 转换为空接口(interface) slice

mongodb - mongodb无法在Go中执行事务,并且总是得到无法在多文档事务中创建 namespace