gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:26:15 27 4
gpt4 key购买 nike

我想使用 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/

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