如何在GoLang程序中运行二进制文件?

10

我希望能在GoLang程序中执行二进制文件。

以下是我的代码:

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    output, _ := exec.Command("/home/user/Golang/bin/hello").Output()
    fmt.Println(output)
}

但是我得到的输出结果是: []。
提前感谢。

检查从Output返回的错误。同时,使用fmt.Printf("%s\n", output)将输出作为文本查看。 - Charlie Tumahai
2个回答

11

我可以获得输出。

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    output, err := exec.Command("/Users/duguying/gopath/bin/test").Output()
    if err!=nil {
        fmt.Println(err.Error())
    }
    fmt.Println(string(output))
}

首先请检查您的二进制文件,或者确认二进制文件路径是否正确。尝试打印出您的错误消息。


1

当我查看 exec.Command() 的源代码时,它不会返回错误,而是仅返回 exe 包中的结构体 Cmdsource

....

func Command(name string, arg ...string) *Cmd {
    cmd := &Cmd{
        Path: name,
        Args: append([]string{name}, arg...),
    }
    if filepath.Base(name) == name {
        if lp, err := LookPath(name); err != nil {
            cmd.lookPathErr = err
        } else {
            cmd.Path = lp
        }
    }
    return cmd
}

....

我已经成功地使用以下代码运行了二进制文件:

package main

import (

    "fmt"
    "os/exec"
)

func main() {
    command:= exec.Command("Your binary file path")

    // set var to get the output
    var out bytes.Buffer

     // set the output to our variable
     command.Stdout = &out
     err = command.Run()
     if err != nil {
         log.Println(err)
     }

    fmt.Println(out.String())
}

这个对我来说可行,可以运行一个二进制文件并打印一些随机字符串。


有更好的方法吗?这将作为一个单独的任务运行。在goroutines下运行会使情况变得更糟。同时运行更多的任务,最终会使用所有服务器资源。 - Mir Adnan
对于我来说,在Windows上,exec只能使用可执行文件的完整路径。例如,./test.bat无法工作。 - Somnium
我建议将这行代码的 pull request 从 err = command.Run() 改为 err := command.Run(),以避免出现 undeclared name: err 的错误。 - Sal Prima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接