gpt4 book ai didi

go - 同时扫描 stdout 和 stderr

转载 作者:IT王子 更新时间:2023-10-29 00:46:00 25 4
gpt4 key购买 nike

我正在寻找一种将 stdout 和 stderr 作为一个流同时处理的方法。对于标准输出,我可以使用:

cmd := exec.Command(command, flags...)
var wg sync.WaitGroup

stdout, err := cmd.StdoutPipe()
if err != nil {
return fmt.Errorf("RunCommand: cmd.StdoutPipe(): %v", err)
}

if err := cmd.Start(); err != nil {
return fmt.Errorf("RunCommand: cmd.Start(): %v", err)
}

scanner := bufio.NewScanner(stdout)
scanner.Split(ScanLinesR)
wg.Add(1)
go func() {
for scanner.Scan() {
text := scanner.Text()
if strings.TrimSpace(text) != "" {
DoWhateverYouNeedWithText(text)
}
}
wg.Done()
}()

wg.Wait()

但是如何将 stderr 添加到相同的代码中呢?

最佳答案

正如上面的评论者所建议的,我添加了 2 个 goroutines(一个用于 stderr,一个用于关闭 channel )。

var wg sync.WaitGroup

stdout, err := cmd.StdoutPipe()
if err != nil {
return fmt.Errorf("RunCommand: cmd.StdoutPipe(): %v", err)
}
stderr, err := cmd.StderrPipe()
if err != nil {
return fmt.Errorf("RunCommand: cmd.StderrPipe(): %v", err)
}

if err := cmd.Start(); err != nil {
return fmt.Errorf("RunCommand: cmd.Start(): %v", err)
}

outch := make(chan string, 10)

scannerStdout := bufio.NewScanner(stdout)
scannerStdout.Split(ScanLinesR)
wg.Add(1)
go func() {
for scannerStdout.Scan() {
text := scannerStdout.Text()
if strings.TrimSpace(text) != "" {
outch <- text
}
}
wg.Done()
}()
scannerStderr := bufio.NewScanner(stderr)
scannerStderr.Split(ScanLinesR)
wg.Add(1)
go func() {
for scannerStderr.Scan() {
text := scannerStderr.Text()
if strings.TrimSpace(text) != "" {
outch <- text
}
}
wg.Done()
}()

go func() {
wg.Wait()
close(outch)
}()

for t := range outch {
DoWhateverYouNeedWithText(t)
}

关于go - 同时扫描 stdout 和 stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46518049/

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