如何在Go中调用Python

Date
Created
Aug 5, 2024 01:21 AM
Descrption
好记性不如烂笔头
Tags
记录
全栈工程师
notion image
在Go中调用Python代码可以通过多种方式实现,最常见的方法包括使用子进程执行Python脚本和使用嵌入式Python解释器。以下是这两种方法的详细说明和示例代码:
方法1:使用子进程执行Python脚本
这种方法通过Go的标准库os/exec包来执行Python脚本。
package main import ( "fmt" "log" "os/exec" ) func main() { // 定义要执行的Python脚本路径 script := "path/to/your/script.py" // 创建命令 cmd := exec.Command("python", script) // 获取脚本的输出 output, err := cmd.Output() if err != nil { log.Fatal(err) } // 打印脚本输出 fmt.Println(string(output)) }
方法2:使用嵌入式Python解释器
这种方法使用go-python包来直接在Go中嵌入Python解释器。go-python包提供了对Python C API的封装,使得可以在Go代码中直接调用Python函数。
首先,需要安装go-python包:
go get github.com/sbinet/go-python
然后,可以使用以下示例代码在Go中调用Python:
package main /* #cgo pkg-config: python-3.8 #include <Python.h> */ import "C" import "fmt" func main() { // 初始化Python解释器 C.Py_Initialize() // 定义Python代码 code := ` def add(a, b): return a + b result = add(3, 5) ` // 运行Python代码 C.PyRun_SimpleString(C.CString(code)) // 获取全局命名空间 globals := C.PyEval_GetGlobals() // 获取结果变量 result := C.PyDict_GetItemString(globals, C.CString("result")) // 打印结果 fmt.Println(C.PyLong_AsLong(result)) // 结束Python解释器 C.Py_Finalize() }
注意事项
1. 子进程方法
• 简单易用,不需要额外的依赖。
• 适用于简单的脚本调用,适合独立运行的Python脚本。
• 每次调用都会启动一个新的Python进程,开销较大。
2. 嵌入式方法
• 性能更好,因为不需要每次都启动新的进程。
• 需要处理更多的细节,如初始化和结束Python解释器、错误处理等。
• 需要安装Python开发头文件(通常通过Python的开发包提供)。
选择哪种方法取决于具体的使用场景和需求。对于简单的任务,使用子进程方法可能更方便;而对于需要频繁调用Python代码或需要更高性能的场景,嵌入式方法更为适合。