16

I have tried following the Go Docs in order to call a python script which just outputs "Hello" from GO, but have failed until now.

exec.Command("script.py")

or I've also tried calling a shell script which simply calls the python script, but also failed:

exec.Command("job.sh")

Any ideas how would I achieve this?

EDIT

I solved following the suggestion in the comments and adding the full path to exec.Command().

3 Answers 3

14

Did you try adding Run() or Output(), as in:

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

You can see it used in "How to execute a simple Windows DOS command in Golang?" (for Windows, but the same idea applies for Unix)

c := exec.Command("job.sh")

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

Or, with Output() as in "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))
Sign up to request clarification or add additional context in comments.

6 Comments

I followed your first suggestion and got exec: "job.sh": executable file not found in $PATH. Doing echo $PATH I get: /home/claudiu/cloud/goServer/. Changing the code to run: exec.Command("~/cloud/goServer/src/job.sh").Run() I got exec: "~/cloud/goServer/src/job.sh": stat ~/cloud/goServer/src/job.sh: no such file or directory
@ClaudiuS could you replace ~ with the full path? (like I suppose /home/claudiu/...)
ah! getting exec: "/home/claudiu/cloud/goServer/src/job.sh": permission denied...so it's just a chmod problem now. Thanks!
Actually, can you set chmod +x as an argument in exec.Command()?
Can you also tell if the code flow in go file waits until the external python script ends or this is like a async process where go code just spawns the process and moves ahead without waiting for the script to end? If there are concurrent calls to that same go code, will it spawn new process with same script in every call?
|
9

First of all do not forget to make your python script executable (permissions and #!/usr/local/bin/python at the beginning).

After this you can just run something similar to this (notice that it will report you errors and standard output).

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())
}

Comments

2

Below worked for me on 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)
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.