无法使用 os/exec 包执行 go 文件

我正在按照golang 教程编写我的 Web 应用程序。我正在修改教程页面中的代码,以便我可以将保存的页面作为 go 代码执行(类似于go playground)。但是当我尝试使用该os/exec包执行保存的 go 文件时,它会引发以下错误。


exec: "go run testcode.go": 在 $PATH 中找不到可执行文件


以下是我修改后的代码:


// Structure to hold the Page

type Page struct {

    Title  string

    Body   []byte

    Output []byte

}


// saving the page

func (p *Page) save() { // difference between func (p *Page) and func (p Page)

    filename := p.Title + ".go"

    ioutil.WriteFile(filename, p.Body, 0777)

}


// handle for the editing

func editHandler(w http.ResponseWriter, r *http.Request) {

    title := r.URL.Path[len("/edit/"):]


    p, err := loadPage(title)


    if err != nil {

        p = &Page{Title: title}

    }

    htmlTemp, _ := template.ParseFiles("edit.html")

    htmlTemp.Execute(w, p)

}


// saving the page

func saveHandler(w http.ResponseWriter, r *http.Request) {

    title := r.URL.Path[len("/save/"):]

    body := r.FormValue("body")


    p := Page{Title: title, Body: []byte(body)}

    p.save()


    http.Redirect(w, r, "/exec/"+title, http.StatusFound) // what is statusfound

}


// this function will execute the code.

func executeCode(w http.ResponseWriter, r *http.Request) {


    title := r.URL.Path[len("/exec/"):]


    cmd := "go run " + title + ".go"

    //cmd = "go"

    fmt.Print(cmd)

    out, err := exec.Command(cmd).Output()


    if err != nil {

        fmt.Print("could not execute")

        fmt.Fprint(w, err)

    } else {

        p := Page{Title: title, Output: out}


        htmlTemp, _ := template.ParseFiles("output.html")

        htmlTemp.Execute(w, p)

    }

}

请告诉我为什么我无法执行 go 文件。


达令说
浏览 300回答 2
2回答

繁星点点滴滴

您以错误的方式调用命令。第一个字符串是可执行文件的完整路径os.exec.Command:func Command(name string, arg ...string)所以你要 exec.Command("/usr/bin/go", "run", title+".go")

哈士奇WWW

接受的答案指出os.exec.Command的第一个参数是可执行文件的完整路径。从文档:“如果名称不包含路径分隔符,如果可能,Command 使用 LookPath将路径解析为完整名称。否则直接使用名称”。executable file not found in $PATH除了像之前建议的那样在可执行文件名称之后传递参数之外,您还应该做些什么来避免错误,那PATH就是在您的 SHELL 中或使用os.Setenv设置您的参数。如果您对命令的完整位置进行硬编码,则您的程序可能无法移植到另一个 Unix 操作系统。例如,该命令lspci位于下/usr/bin在Ubuntu和下/sbin/在RHEL。如果你这样做:os.Setenv("PATH", "/usr/bin:/sbin")exec.Command("lspci", "-mm")然后你的程序将在 ubuntu 和 RHEL 中执行。或者,形成外壳,您还可以执行以下操作: PATH=/sbin; my_program注意:上述命令仅限PATH于明确指示的路径。例如,如果要添加到 shell 中的现有路径,请执行PATH=/sbin:$PATH; my_program; 在 go 中,您可能可以使用 读取变量,os.Getenv然后在执行os.Setenv.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go