In diesem Szenario wollen wir die Lücke zwischen Go und Python schließen, indem wir eine Python-Funktion aus einem Go-Programm aufrufen und Erfassen seines Rückgabewerts zur weiteren Verarbeitung. Erste Versuche erwiesen sich jedoch als erfolglos, um die gewünschten Daten abzurufen.
Der Stolperstein
Das bereitgestellte Minimalbeispiel verdeutlicht die Herausforderung:
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") }
Entsprechender Python-Code:
def cat_strings(a, b): return a + b
Go-Run-Gofile wird ausgeführt ergibt:
here we go... command args: [python -c 'import pythonfile; print pythonfile.cat_strings("foo", "bar")'] concatenation length: 0 concatenation: ...done
Die Lösung
Um dieses Hindernis zu überwinden, mussten unnötige Anführungszeichen um den Befehl selbst umsichtig entfernt werden:
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)) }
Dies Die Änderung führte zu einem erfolgreichen Abruf des Rückgabewerts der Funktion:
$ python -c "import pythonfile; print pythonfile.cat_strings('foo', 'bar')" foobar
Das obige ist der detaillierte Inhalt vonWie kann ich den Rückgabewert einer Python-Funktion abrufen, die von einem Go-Programm aufgerufen wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!