Tôi đang viết chương trình Go. Từ chương trình Go này, tôi muốn gọi hàm Python được định nghĩa trong một tệp khác và nhận giá trị trả về của hàm để tôi có thể sử dụng nó trong quá trình xử lý tiếp theo trong chương trình Go của tôi. Tôi đang gặp khó khăn khi nhận lại bất kỳ dữ liệu nào trong chương trình Go của tôi. Dưới đây là một ví dụ tối thiểu là những gì tôi nghĩ sẽ làm việc, nhưng dường như không:Gọi chức năng Python từ Go và nhận giá trị trả về hàm
gofile.go
package main
import "os/exec"
import "fmt"
func main() {
fmt.Println("here we go...")
program := "python"
arg0 := "-c"
arg1 := fmt.Sprintf("'import pythonfile; print pythonfile.cat_strings(\"%s\", \"%s\")'", "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("concatentation length: ", len(out))
fmt.Println("concatenation: ", string(out))
fmt.Println("...done")
}
pythonfile.py
def cat_strings(a, b):
return a + b
Nếu tôi gọi go run gofile
Tôi nhận được kết quả sau:
here we go...
command args: [python -c 'import pythonfile; print pythonfile.cat_strings("foo", "bar")']
concatentation length: 0
concatenation:
...done
Một vài lưu ý:
- Tôi đang sử dụng
-c
cờ trong invocation Python vì vậy tôi có thể gọi hàmcat_strings
trực tiếp. Giả sửcat_strings
là một phần của tệp Python đầy đủ các hàm tiện ích được sử dụng bởi các chương trình Python khác, do đó tại sao tôi không có bất kỳ hoạt động kinh doanhif __name__ == __main__
nào. - Tôi không muốn sửa đổi tệp Python thành
print a + b
(thay vìreturn a + b
); xem điểm trước về hàm là một phần của một tập hợp các hàm tiện ích cần được gọi bằng mã Python khác. - Chức năng
cat_strings
là hư cấu và cho mục đích trình diễn; chức năng thực sự là thứ tôi không muốn đơn giản thực hiện lại trong Go. Tôi thực sự quan tâm đến cách tôi có thể gọi một hàm Python từ Go và nhận giá trị trả về.
Tôi có cảm giác rằng việc này không thể thực hiện dễ dàng bằng cách sử dụng 'os/exec'. Tất cả các hàm 'os/exec' chỉ trả về stdout và/hoặc stderr. – Intermernet
Hãy xem https://github.com/sbinet/go-python và http://stackoverflow.com/questions/12443203/writing-a-python-extension-in-go-golang – Intermernet
@Intermernet Tôi nghĩ rằng gọi 'print' trong' python -c 'nhập pythonfile; print pythonfile.cat_strings ("foo", "bar") ''sẽ được in thành stdout. –