我使用Go为各种平台编译一个程序,并通过调用相对路径或仅通过其名称(如果它在PATH变量中)来运行它。
是否有可能找到可执行文件的位置?
说,我的程序名为“foo
(.exe
)”。我可以运行./foo
,foo
(如果它在PATH中),../../subdir/subdir/foo
。
我尝试使用os.Args[0]
,我想我应该检查程序名称是否包含除“foo”之外的其他内容。如果是,请使用filepath.Abs
,如果不是,请使用(我找不到函数名称,有一个函数可以通过PATH查看程序的位置)。
答案 0 :(得分:44)
使用包osext。
它提供函数Executable()
,它返回当前程序可执行文件的绝对路径。
它可以在系统之间移植。
package main
import (
"github.com/kardianos/osext"
"fmt"
)
func main() {
filename, _ := osext.Executable()
fmt.Println(filename)
}
答案 1 :(得分:23)
您可以使用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)
}
答案 2 :(得分:4)
这不是具体的(除非go“标准库”包含一些功能),并且没有可移植的解决方案。有关某些常见平台的解决方案,请参阅例How do I find the location of the executable in C?或Finding current executable's path without /proc/self/exe。