Dalam senario ini, kami berhasrat untuk merapatkan jurang antara Go dan Python dengan menggunakan fungsi Python daripada program Go dan menangkap nilai pulangannya untuk pemprosesan selanjutnya. Walau bagaimanapun, percubaan awal telah terbukti tidak berjaya dalam mendapatkan semula data yang diingini.
Balok Sandung
Contoh minimum yang diberikan menggambarkan cabaran:
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") }
Kod Python yang sepadan:
def cat_strings(a, b): return a + b
Melaksanakan go run gofile menghasilkan:
here we go... command args: [python -c 'import pythonfile; print pythonfile.cat_strings("foo", "bar")'] concatenation length: 0 concatenation: ...done
Penyelesaian
Mengatasi halangan ini memerlukan penyingkiran yang bijak bagi petikan yang tidak perlu di sekeliling perintah itu sendiri:
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)) }
Ini pengubahsuaian menghasilkan kejayaan mendapatkan kembali pemulangan fungsi nilai:
$ python -c "import pythonfile; print pythonfile.cat_strings('foo', 'bar')" foobar
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Nilai Pulangan Fungsi Python yang Dipanggil daripada Program Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!