繁体   English   中英

流os / exec.Command

[英]streaming os/exec.Command

我想构建一个与unix工具time类似的基准测试工具。 我目前所拥有的是:

package main

import (
    "fmt"
    "os"
    "os/exec"
    "time"
)

func main() {
    command := os.Args[1]
    args := os.Args[2:]
    cmd := exec.Command(command, args...)
    start_time := time.Now().UnixNano()
    stdout, err := cmd.Output()

    if err != nil {
        println(err.Error())
        return
    }

    print(string(stdout))
    total_time := int64(time.Nanosecond) * (time.Now().UnixNano() - start_time) / int64(time.Millisecond)
    fmt.Println(total_time)
}

我的问题是,输出不是流式传输,而是一次全部打印,而且对于某些程序来说完全不可思议。

最好的方法是避免完全接触流。 您可以直接为stdout和stderr传递自己的文件描述符。

package main

import (
    "fmt"
    "os"
    "os/exec"
    "time"
)

func main() {
    command := os.Args[1]
    args := os.Args[2:]
    cmd := exec.Command(command, args...)
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    start_time := time.Now()

    err := cmd.Run()
    if err != nil {
        println(err.Error())
        return
    }

    total_time := int64(time.Since(start_time) / time.Millisecond)
    fmt.Println(total_time)
}

另外,永远不要使用print()。 而是使用fmt.Print *函数之一。


total_time := int64(time.Nanosecond) * (time.Now().UnixNano() - start_time) / int64(time.Millisecond)

这条线非常令人困惑。 int64(time.Nanosecond) * x解析为1 * xx

我不确定您要在这里使用print(string(stdout))做什么,但这是不必要的,而且您所面临的问题很可能是那里一些误用的副作用。

func main() {
    command := os.Args[1]
    args := os.Args[2:]
    cmd := exec.Command(command, args...)
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    start_time := time.Now().UnixNano()

    if err != nil {
        fmt.Println(err.Error())
        return
    }

    total_time := int64(time.Nanosecond) * (time.Now().UnixNano() - start_time) / int64(time.Millisecond)
    fmt.Println(total_time)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM