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

如何捕获标准输出并显示进度

如何捕获标准输出并显示进度

Go
holdtom 2022-06-27 11:03:06
我有一个名为print()每 2 秒打印一次数字的函数,该函数在 goroutine 中运行。我需要将其标准输出打印传递给一个变量并打印它,但不是一次,直到它完成。我需要有一个无限循环中的扫描仪,它将扫描标准输出并打印它,一旦功能完成,扫描仪也将完成。我试图使用这个答案,但它没有打印任何东西。这就是我试图做的:package mainimport (    "bufio"    "fmt"    "os"    "sync"    "time")func print() {    for i := 0; i < 50; i++ {        time.Sleep(2 * time.Second)        fmt.Printf("hello number: %d\n", i)    }}func main() {    old := os.Stdout // keep backup of the real stdout    defer func() { os.Stdout = old }()    r, w, _ := os.Pipe()    os.Stdout = w    go print()    var wg sync.WaitGroup    c := make(chan struct{})    wg.Add(1)    defer wg.Done()    for {        <-c        scanner := bufio.NewScanner(r)        for scanner.Scan() {            m := scanner.Text()            fmt.Println("output: " + m)        }    }    c <- struct{}{}    wg.Wait()    fmt.Println("DONE")}  
查看完整描述

1 回答

?
饮歌长啸

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

可以print()作为“黑盒”运行并捕获其输出,尽管它有点棘手并且不适用于 Go Playground。


package main


import (

    "bufio"

    "fmt"

    "os"

    "runtime"

    "time"

)



func print() {

    for i := 0; i < 50; i++ {

        time.Sleep(100 * time.Millisecond)

        fmt.Printf("hello number: %d\n", i)

    }

}


func main() {


    var ttyName string

    if runtime.GOOS == "windows" {

    fmt.Println("*** Using `con`")

        ttyName = "con"

    } else {

    fmt.Println("*** Using `/dev/tty`")

        ttyName = "/dev/tty"

    }   


    f, err := os.OpenFile(ttyName, os.O_WRONLY, 0644)

    if err != nil {

        panic(err)

    }

    defer f.Close()


    r, w, _ := os.Pipe()

    oldStdout := os.Stdout

    os.Stdout = w

    defer func() { 

        os.Stdout = oldStdout

        fmt.Println("*** DONE")

    }()


    fmt.Fprintln(f, "*** Stdout redirected")


    go func(){

       print()

       w.Close()

       r.Close()          

    }()


    c := make(chan struct{})

    go func(){c <- struct{}{}}()

    defer close(c)


    <-c

    scanner := bufio.NewScanner(r)

    for scanner.Scan() {

        m := scanner.Text()

        fmt.Fprintln(f, "output: " + m)

    }

}


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

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