V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
jeesk
V2EX  ›  Go 编程语言

golang 的标准输出

  •  
  •   jeesk · 118 天前 · 1681 次点击
    这是一个创建于 118 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我想将 htop 封装到 exec.Command(). 然后继续将输出打印出来, 当我使用 stdout := cmd.StdoutPipe() 加上 bufio.NewScanner(stdout)的时候, 其实只能打印 htop 的一行。 有什么办法模拟 stdout 的输出?
    7 条回复    2024-07-24 15:16:10 +08:00
    Foralrec
        1
    Foralrec  
       118 天前
    这段加上了么

    ```
    var stdoutBuilder strings.Builder
    for stdoutScanner.Scan() {
    stdoutBuilder.WriteString(stdoutScanner.Text() + "\n")
    }

    ```
    securityCoding
        2
    securityCoding  
       118 天前
    @Foralrec 🤣
    jeesk
        3
    jeesk  
    OP
       118 天前
    不是, 最主要的是 stdoutScaner.Text() 是一行, 但是命令每次是覆盖输出。
    我这里的 htop 命令只是举例。 大概是这样(下面是举例):
    执行 htop 后: 下面的输出会不断刷新。
    第一次输出:
    hello world!
    hello python!
    hello java!
    第二次输出:
    hello china!
    hello usa!
    hello japan!

    这种命令的输出只有 cmd.stdout = os.Stdout , 才能像命令行一样持续输出。 如果使用 stdoutScanner.Text() 这种每次只能得到一样, 根本不知道 hello japan! 的上下文是什么。 我无法获取到有用的信息。
    jeesk
        4
    jeesk  
    OP
       118 天前
    此帖终结, 目前 golang 没有太好的办法。 目前采用的办法是修改调用软件的输出,重新编译源码。
    zzhaolei
        5
    zzhaolei  
       117 天前
    为什么说 Go 没有太好的办法,想实现你说的不断刷新的效果,需要对历史的输出清屏。

    我试了下,是可以实现刷新输出的。

    https://go.dev/play/p/y6q_pWonwwp
    julyclyde
        6
    julyclyde  
       117 天前
    htop 是不是用的 tty 啊?
    xi4oyu
        7
    xi4oyu  
       116 天前
    可以了解一下 pty ,和这个有关,不知道咋说明白
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2869 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 14:43 · PVG 22:43 · LAX 06:43 · JFK 09:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.