Dans ce scénario, nous visons à combler le fossé entre Go et Python en appelant une fonction Python à partir d'un programme Go et capturer sa valeur de retour pour un traitement ultérieur. Cependant, les premières tentatives se sont révélées infructueuses pour récupérer les données souhaitées.
La pierre d'achoppement
L'exemple minimal fourni illustre le défi :
package main import ( "fmt" "os/exec" ) func main() { fmt.Println("here we go...") program := "python" arg0 := "-c" arg1 := fmt.Sprintf("'%s'", "import pythonfile; print pythonfile.cat_strings(\"foo\", \"bar\")'") cmd := exec.Command(program, arg0, arg1) fmt.Println("command args:", cmd.Args) out, err := cmd.CombinedOutput() if err != nil { fmt.Println("Concatenation failed with error:", err.Error()) return } fmt.Println("concatenation length:", len(out)) fmt.Println("concatenation:", string(out)) fmt.Println("...done") }
Code Python correspondant :
def cat_strings(a, b): return a + b
Exécution de go run gofile donne :
here we go... command args: [python -c 'import pythonfile; print pythonfile.cat_strings("foo", "bar")'] concatenation length: 0 concatenation: ...done
La solution
Surmonter cet obstacle a nécessité la suppression judicieuse des guillemets inutiles autour de la commande elle-même :
package main import ( "fmt" "os/exec" ) func main() { cmd := exec.Command("python", "-c", "import pythonfile; print pythonfile.cat_strings('foo', 'bar')") fmt.Println(cmd.Args) out, err := cmd.CombinedOutput() if err != nil { fmt.Println(err) } fmt.Println(string(out)) }
Ceci la modification a abouti à une récupération réussie de la valeur de retour de la fonction :
$ python -c "import pythonfile; print pythonfile.cat_strings('foo', 'bar')" foobar
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!