无法捕获 cmd.Run() stdout,stderr 没问题

这个简单的 python 脚本生成 stdout/stderr 消息,每秒两条。


#!/usr/bin/env python3

import sys, time

for a in range(10):

    if(a%2==0): print(a, file=sys.stdout)

    else: print(a, file=sys.stderr)

    time.sleep(0.5)

print("This is an STDOUT message")

print("This is an STDERR message", file=sys.stderr)

sys.exit(1)

示例输出:


> ./runstatus.py 

0    <- STDOUT, after 0.5s

1    <- STDERR, after 0.5s

2    <- STDOUT, after 0.5s

3    ...

4

5

6

7

8

9

This is an STDOUT message     <- STDOUT

This is an STDERR message     <- STDERR

我需要用 golang 实时捕获 stdout 和 stderr 输出,所以我还发现了这个:


package main

import("bufio"; "fmt"; "os/exec";)

func readerr(scanner *bufio.Scanner, channel string) {

    for scanner.Scan() { fmt.Println(channel, scanner.Text()); }

}

func main() {

    cmd:=exec.Command("./runstatus.py")

    stdout, _:=cmd.StdoutPipe()

    stderr, _:=cmd.StderrPipe()

    scanout:=bufio.NewScanner(stdout)

    scanerr:=bufio.NewScanner(stderr)

    scanout.Split(bufio.ScanLines)

    scanerr.Split(bufio.ScanLines)

    go readerr(scanout, "out:")

    go readerr(scanerr, "err:")

    cmd.Start()

    cmd.Wait()

}

但问题是这只适用于 STDERR!!!Stderr 是实时的,但 stdout 不是,它在执行结束时突然颠簸:


err: 1    <- STDERR, after 1s

err: 3    <- STDERR, after 1s

err: 5

err: 7

err: 9

out: 0    <- STDOUT, after 5s, from here, the rest just flushes abruptly!

out: 2

out: 4

out: 6

out: 8

out: This is an STDOUT message

err: This is an STDERR message

我究竟做错了什么?


慕码人8056858
浏览 93回答 1
1回答

米脂

问题可能是在 Python 中,print标准输出的输出被缓冲了。解决方案可能取决于 Python 版本。例如,使用 -u 选项运行脚本python&nbsp;-u&nbsp;./runstatus.py从 Python 3.3 开始,该print函数有一个flash参数,您可以尝试使用它:print(a,&nbsp;file=sys.stdout,&nbsp;flush=True)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go