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

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

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

Go
慕码人8056858 2023-03-07 11:43:26
这个简单的 python 脚本生成 stdout/stderr 消息,每秒两条。#!/usr/bin/env python3import sys, timefor 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.5s1    <- STDERR, after 0.5s2    <- STDOUT, after 0.5s3    ...456789This is an STDOUT message     <- STDOUTThis is an STDERR message     <- STDERR我需要用 golang 实时捕获 stdout 和 stderr 输出,所以我还发现了这个:package mainimport("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 1serr: 3    <- STDERR, after 1serr: 5err: 7err: 9out: 0    <- STDOUT, after 5s, from here, the rest just flushes abruptly!out: 2out: 4out: 6out: 8out: This is an STDOUT messageerr: This is an STDERR message我究竟做错了什么?
查看完整描述

1 回答

?
米脂

TA贡献1836条经验 获得超3个赞

问题可能是在 Python 中,print标准输出的输出被缓冲了。解决方案可能取决于 Python 版本。

例如,使用 -u 选项运行脚本

python -u ./runstatus.py

从 Python 3.3 开始,该print函数有一个flash参数,您可以尝试使用它:

print(a, file=sys.stdout, flush=True)


查看完整回答
反对 回复 2023-03-07
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

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