35

我使用 Go 为各种平台编译一个程序,并通过调用相对路径或仅通过其名称(如果它在 PATH 变量中)来运行它。

是否有可能找出可执行文件的位置?

比如说,我的程序叫做“ foo.exe)”。我可以运行./foo, foo(如果它在 PATH 中), ../../subdir/subdir/foo.

我尝试过使用os.Args[0],我想我应该检查程序名称是否包含除“foo”之外的其他内容。如果是,使用filepath.Abs,如果不是,使用(我找不到函数名,有一个函数可以通过 PATH 来检查程序在哪里)。

4

3 回答 3

47

使用包osext

它提供Executable()了返回当前程序可执行文件的绝对路径的函数。它可以在系统之间移植。

在线文档

package main

import (
    "github.com/kardianos/osext"
    "fmt"
)

func main() {
    filename, _ := osext.Executable()
    fmt.Println(filename)
}
于 2013-02-23T07:27:58.357 回答
43

您可以os.Executable用于获取 Go 1.8 或更高版本的可执行路径。

import (
    "os"
    "path"
    "log"
)

func main() {
    ex, err := os.Executable()
    if err != nil { log.Fatal(err) }
    dir := path.Dir(ex)
    log.Print(dir)
}
于 2017-02-22T16:18:06.157 回答
4

这不是特定于 go 的(除非 go“标准库”包含一些功能),并且没有可移植的解决方案。有关某些常见平台上的解决方案,请参阅如何在 C 中找到可执行文件的位置?在没有 /proc/self/exe 的情况下查找当前可执行文件的路径

于 2012-08-23T11:09:50.750 回答