[go] 현재 실행중인 파일의 디렉토리를 얻는 방법?

nodejs에서는 __dirname을 사용 합니다 . Golang에서 이에 상응하는 것은 무엇입니까?

나는 googled 하고이 기사 http://andrewbrookins.com/tech/golang-get-directory-of-the-current-file/을 발견했다 . 그가 아래 코드를 사용하는 곳

_, filename, _, _ := runtime.Caller(1)
f, err := os.Open(path.Join(path.Dir(filename), "data.csv"))

그러나 골랑에서하는 것이 올바른 방법입니까, 관용적 인 방법입니까?



답변

이것은해야합니다 :

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
)

func main() {
    dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
    if err != nil {
            log.Fatal(err)
    }
    fmt.Println(dir)
}


답변

편집 : Go 1.8 (2017 년 2 월 릴리스) 현재 권장되는 방법은 다음과 os.Executable같습니다.

func Executable() (string, error)

실행 파일은 현재 프로세스를 시작한 실행 파일의 경로 이름을 반환합니다. 경로가 여전히 올바른 실행 파일을 가리키고 있다는 보장은 없습니다. 운영 체제에 따라 symlink를 사용하여 프로세스를 시작한 경우 결과는 symlink 또는 지정된 경로 일 수 있습니다. 안정적인 결과가 필요한 경우 path / filepath.EvalSymlinks가 도움이 될 수 있습니다.

실행 파일의 디렉토리 만 얻으려면 사용할 수 있습니다 path/filepath.Dir.

:

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    ex, err := os.Executable()
    if err != nil {
        panic(err)
    }
    exPath := filepath.Dir(ex)
    fmt.Println(exPath)
}

오래된 답변 :

사용할 수 있어야합니다 os.Getwd

func Getwd() (pwd string, err error)

Getwd는 현재 디렉토리에 해당하는 루트 경로 이름을 반환합니다. 심볼릭 링크로 인해 여러 경로를 통해 현재 디렉토리에 도달 할 수있는 경우 Getwd는 그 중 하나를 반환 할 수 있습니다.

예를 들면 다음과 같습니다.

package main

import (
    "fmt"
    "os"
)

func main() {
    pwd, err := os.Getwd()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(pwd)
}


답변

패키지 osext 사용

ExecutableFolder()현재 실행중인 프로그램 실행 파일이있는 폴더의 절대 경로를 반환 하는 기능 을 제공 합니다 (cron 작업에 유용함). 크로스 플랫폼입니다.

온라인 문서

package main

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

func main() {
    folderPath, err := osext.ExecutableFolder()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(folderPath)
}


답변

filepath.Abs("./")

Abs는 경로의 절대 표현을 반환합니다. 경로가 절대 경로가 아닌 경우 현재 작업 디렉토리와 결합되어 절대 경로로 바뀝니다.

주석에 언급 된대로 현재 활성화 된 디렉토리를 반환합니다.


답변

이 방법을 사용하면 :

dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
    log.Fatal(err)
}
fmt.Println(dir)

실행 파일은 / tmp에서 저장 및 실행되므로 GoLang과 같은 일부 IDE를 사용하여 프로그램을 실행할 때 / tmp 경로를 얻습니다.

현재 작업 디렉토리 또는 ‘.’을 얻는 가장 좋은 방법이라고 생각합니다. 입니다 :

import(
  "os"
  "fmt"
  "log"
)

func main() {
  dir, err := os.Getwd()
    if err != nil {
        log.Fatal(err)
    }
  fmt.Println(dir)
}

os.Getwd () 함수는 현재 작업 디렉토리를 반환합니다. 외부 라이브러리를 사용하지 않고 모든 것 : D


답변

당신이 패키지를 사용하는 경우 osext 에 의해 kardianos을 데릭 다울 링은 주석처럼 당신은 로컬 테스트해야합니다 :

이것은 로컬 개발을 위해 go run main.go와 함께 사용할 때까지 잘 작동합니다. 매번 실행 파일을 미리 작성하지 않고 어떻게 해결할 수 있는지 잘 모르겠습니다.

이에 대한 해결책은 go run을 사용하는 대신 gorun.exe 유틸리티를 만드는 것입니다. gorun.exe 유틸리티는 “go build”를 사용하여 프로젝트를 컴파일 한 다음 프로젝트의 일반 디렉토리에서 바로 실행합니다.

나는 다른 컴파일러와 함께이 문제가 있었고 컴파일러와 함께 제공되지 않기 때문에이 유틸리티를 만드는 것을 발견했습니다 … 특히 C와 같은 도구를 사용하여 컴파일하고 링크 한 다음 실행해야합니다 (너무 많은 작업).

gorun.exe (또는 elf)에 대한 아이디어가 마음에 든다면 곧 github에 업로드 할 것입니다.

죄송합니다.이 답변은 의견입니다.하지만 아직 평판이 좋지 않아서 댓글을 달 수 없습니다.

또는 “go run”을 수정하여 (이 기능이없는 경우) “go run -notemp”와 같은 매개 변수를 사용하여 임시 디렉토리 (또는 이와 유사한 것)에서 프로그램을 실행하지 않을 수 있습니다. 그러나 복잡한 매개 변수보다 짧으므로 gorun 또는 “gor”을 입력하는 것이 좋습니다. Gorun.exe 또는 gor.exe는 go 컴파일러와 동일한 디렉토리에 설치해야합니다.

gorun.exe (또는 gor.exe)를 구현하는 것은 몇 줄의 코드로 다른 컴파일러와 함께 했으므로 간단합니다 … (유명한 마지막 단어 😉


답변

os.Executable: https://tip.golang.org/pkg/os/#Executable

filepath.EvalSymlinks: https://golang.org/pkg/path/filepath/#EvalSymlinks

전체 데모 :

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    var dirAbsPath string
    ex, err := os.Executable()
    if err == nil {
        dirAbsPath = filepath.Dir(ex)
        fmt.Println(dirAbsPath)
        return
    }

    exReal, err := filepath.EvalSymlinks(ex)
    if err != nil {
        panic(err)
    }
    dirAbsPath = filepath.Dir(exReal)
    fmt.Println(dirAbsPath)
}