我正在编写Go程序。从这个Go程序中,我想调用另一个文件中定义的Python函数并接收该函数的返回值,以便可以在Go程序的后续处理中使用它。我在将所有返回的数据恢复到我的Go程序时遇到了麻烦。以下是我认为可行的最低示例,但显然无效:
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
如果我打电话,go run gofile我得到以下输出:
here we go...
command args: [python -c 'import pythonfile; print pythonfile.cat_strings("foo", "bar")']
concatentation length: 0
concatenation:
...done
一些注意事项:
我-c在Python调用中使用该标志,因此可以cat_strings直接调用该函数。假定cat_strings是Python文件的一部分,该文件包含其他Python程序使用的实用程序功能,因此为什么我没有任何if __name__ == __main__生意。
我不想将Python文件修改为print a + b(而不是return a + b);参见关于该函数属于一组实用程序函数的一部分的先前要点,这些实用函数应该由其他Python代码调用。
该cat_strings功能是虚构的,用于演示目的;真正的功能是我不想简单地在Go中重新实现的功能。我真的对如何从Go调用Python函数并获取返回值感兴趣。