为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
达令说 2021-09-09 21:46:15
我正在按照golang 教程编写我的 Web 应用程序。我正在修改教程页面中的代码,以便我可以将保存的页面作为 go 代码执行(类似于go playground)。但是当我尝试使用该os/exec包执行保存的 go 文件时,它会引发以下错误。exec: "go run testcode.go": 在 $PATH 中找不到可执行文件以下是我修改后的代码:// Structure to hold the Pagetype Page struct {    Title  string    Body   []byte    Output []byte}// saving the pagefunc (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 editingfunc 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 pagefunc 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 文件。
查看完整描述

2 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

您以错误的方式调用命令。第一个字符串是可执行文件的完整路径

os.exec.Commandfunc Command(name string, arg ...string)

所以你要 exec.Command("/usr/bin/go", "run", title+".go")


查看完整回答
反对 回复 2021-09-09
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

接受的答案指出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.


查看完整回答
反对 回复 2021-09-09
  • 2 回答
  • 0 关注
  • 299 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信