【问题标题】:Go: Run External Python scriptGo:运行外部 Python 脚本
【发布时间】:2014-11-19 16:09:28
【问题描述】:

我尝试按照 Go 文档调用一个 python 脚本,该脚本只从 GO 输出“Hello”,但直到现在都失败了。

exec.Command("script.py")

或者我也试过调用一个简单地调用python脚本的shell脚本,但也失败了:

exec.Command("job.sh")

任何想法我将如何实现这一目标?

编辑

我按照 cmets 中的建议解决了问题,并将完整路径添加到 exec.Command()。

【问题讨论】:

    标签: go exec


    【解决方案1】:

    您是否尝试添加Run()Output(),如:

    exec.Command("script.py").Run()
    exec.Command("job.sh").Run()
    

    你可以看到它在“How to execute a simple Windows DOS command in Golang?”中使用(对于 Windows,但同样的想法适用于 Unix)

    c := exec.Command("job.sh")
    
    if err := c.Run(); err != nil { 
        fmt.Println("Error: ", err)
    }   
    

    或者,使用Output(),如“Exec a shell command in Go”:

    cmd := exec.Command("job.sh")
    out, err := cmd.Output()
    
    if err != nil {
        println(err.Error())
        return
    }
    
    fmt.Println(string(out))
    

    【讨论】:

    • 我按照你的第一个建议得到了 exec: "job.sh": executable file not found in $PATH。做 echo $PATH 我得到:/home/claudiu/cloud/goServer/.更改要运行的代码: exec.Command("~/cloud/goServer/src/job.sh").Run() 我得到了 exec: "~/cloud/goServer/src/job.sh": stat ~/cloud /goServer/src/job.sh: 没有这样的文件或目录
    • @ClaudiuS 你能用完整路径替换~ 吗? (就像我猜想/home/claudiu/...
    • 啊!获取 exec:“/home/claudiu/cloud/goServer/src/job.sh”:权限被拒绝......所以现在这只是一个 chmod 问题。谢谢!
    • 其实可以在exec.Command()中设置chmod +x作为参数吗?
    • 你能否判断 go 文件中的代码流是否等待外部 python 脚本结束,或者这就像一个异步进程,其中 go 代码只是生成进程并继续前进而不等待脚本结束?如果有对同一个 go 代码的并发调用,它会在每次调用中使用相同的脚本生成新进程吗?
    【解决方案2】:

    首先不要忘记让你的python脚本可执行(权限和#!/usr/local/bin/python开头)。

    在这之后你可以运行类似的东西(注意它会报告你错误和标准输出)。

    package main
    
    import (
        "log"
        "os"
        "os/exec"
    )
    
    func main() {
        cmd := exec.Command("script.py")
        cmd.Stdout = os.Stdout
        cmd.Stderr = os.Stderr
        log.Println(cmd.Run())
    }
    

    【讨论】:

      【解决方案3】:

      以下在 Windows 10 上为我工作

      python := path.Clean(strings.Join([]string{os.Getenv("userprofile"), "Anaconda3", "python.exe"}, "/"))
      script := "my_script.py"
      cmd := exec.Command("cmd", python, script)
      out, err := cmd.Output()
      fmt.Println(string(out))
      if err != nil {
          log.Fatal(err)
      }
      

      【讨论】:

        猜你喜欢
        • 2011-05-26
        • 2015-10-01
        • 2014-05-14
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        相关资源
        最近更新 更多