当前位置: 首页 > news >正文

Python与Go结合

Python与Go结合的方法

Python和Go可以通过多种方式结合使用,通常采用跨语言通信或集成的方式。以下是几种常见的方法:

使用CFFI或CGO进行绑定

Python可以通过CFFI(C Foreign Function Interface)调用Go编写的库,而Go可以通过CGO导出函数供Python调用。这种方法需要将Go代码编译为动态链接库(.so或.dll文件),然后在Python中加载并调用。

在Go中编写并导出函数:

package mainimport "C"//export Add
func Add(a, b int) int {return a + b
}func main() {}

编译为动态库:

go build -buildmode=c-shared -o libadd.so add.go

在Python中使用CFFI调用:

from cffi import FFIffi = FFI()
ffi.cdef("int Add(int a, int b);")
lib = ffi.dlopen("./libadd.so")result = lib.Add(2, 3)
print(result)  # 输出5

使用gRPC进行通信

gRPC是一个高性能的远程过程调用框架,支持多种语言。可以在Go中实现gRPC服务端,在Python中实现客户端,或反之。

定义proto文件:

syntax = "proto3";service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}
}message HelloRequest {string name = 1;
}message HelloReply {string message = 2;
}

Go实现服务端:

package mainimport ("context""log""net""google.golang.org/grpc"pb "path/to/your/proto"
)type server struct{}func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}func main() {lis, err := net.Listen("tcp", ":50051")if err != nil {log.Fatalf("failed to listen: %v", err)}s := grpc.NewServer()pb.RegisterGreeterServer(s, &server{})s.Serve(lis)
}

Python实现客户端:

import grpc
from proto import greeter_pb2, greeter_pb2_grpcchannel = grpc.insecure_channel('localhost:50051')
stub = greeter_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(greeter_pb2.HelloRequest(name='World'))
print(response.message)  # 输出 "Hello World"

使用HTTP/REST API

Go可以提供一个HTTP服务,Python通过HTTP请求与之交互。这是最通用的方法之一。

Go实现HTTP服务:

package mainimport ("encoding/json""net/http"
)type Response struct {Message string `json:"message"`
}func handler(w http.ResponseWriter, r *http.Request) {resp := Response{Message: "Hello from Go"}json.NewEncoder(w).Encode(resp)
}func main() {http.HandleFunc("/", handler)http.ListenAndServe(":8080", nil)
}

Python使用requests调用:

import requestsresponse = requests.get("http://localhost:8080")
print(response.json())  # 输出 {"message": "Hello from Go"}

使用消息队列

通过消息队列(如RabbitMQ、Kafka)可以实现Python和Go之间的异步通信。Python作为生产者发送消息,Go作为消费者处理消息,或反之。

Python使用pika发送消息:

import pikaconnection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='', routing_key='hello', body='Hello from Python')
connection.close()

Go使用amqp接收消息:

package mainimport ("log""github.com/streadway/amqp"
)func main() {conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")if err != nil {log.Fatal(err)}defer conn.Close()ch, err := conn.Channel()if err != nil {log.Fatal(err)}defer ch.Close()q, err := ch.QueueDeclare("hello", false, false, false, false, nil)if err != nil {log.Fatal(err)}msgs, err := ch.Consume(q.Name, "", true, false, false, false, nil)if err != nil {log.Fatal(err)}for d := range msgs {log.Printf("Received a message: %s", d.Body)}
}

使用共享内存或文件

对于简单的数据交换,可以通过共享文件或内存实现。Python和Go都可以读写相同的文件或共享内存区域。

Python写入文件:

with open("shared.txt", "w") as f:f.write("Hello from Python")

Go读取文件:

package mainimport ("fmt""io/ioutil"
)func main() {data, err := ioutil.ReadFile("shared.txt")if err != nil {fmt.Println("Error reading file:", err)return}fmt.Println(string(data))  // 输出 "Hello from Python"
}

这些方法各有优缺点,适用于不同的场景。CFFI/CGO适合高性能调用,gRPC适合复杂服务,HTTP/REST通用性强,消息队列适合异步处理,共享文件简单但效率较低。


文章转载自:

http://dwrusXMr.hgsmz.cn
http://RIOHc42H.hgsmz.cn
http://Mi8oPVtk.hgsmz.cn
http://e5PfQF0i.hgsmz.cn
http://8LPlaWk5.hgsmz.cn
http://D17OJUyH.hgsmz.cn
http://wjBH1LuI.hgsmz.cn
http://ucycvTbn.hgsmz.cn
http://WNUK0rs2.hgsmz.cn
http://lr4yDyTd.hgsmz.cn
http://phPjYmLD.hgsmz.cn
http://w5Y49zei.hgsmz.cn
http://UdJr6vj8.hgsmz.cn
http://9i8VVlaz.hgsmz.cn
http://U8l6crPB.hgsmz.cn
http://xgcXAPBt.hgsmz.cn
http://tSxfvHES.hgsmz.cn
http://mJuERtvE.hgsmz.cn
http://BlZckjvq.hgsmz.cn
http://P9n6RUfA.hgsmz.cn
http://Bp3l1mEC.hgsmz.cn
http://WI3DW9Cq.hgsmz.cn
http://5uBkM54m.hgsmz.cn
http://4rgECM7C.hgsmz.cn
http://kFL4rOoa.hgsmz.cn
http://EH7UVYds.hgsmz.cn
http://kBnmNaGq.hgsmz.cn
http://OxXjPqLM.hgsmz.cn
http://UaKZLVdn.hgsmz.cn
http://YHumEWb4.hgsmz.cn
http://www.dtcms.com/a/383181.html

相关文章:

  • AI大师系列——杰夫·辛顿(深度学习)
  • Unity核心概念⑨:Screen
  • 《MLB美职棒大联盟》专业运动员标准·棒球1号位
  • reversed()方法
  • Altium Designer(AD24)另存为功能介绍
  • OD C卷 - 计算三叉搜索树的高度
  • 导购返利APP的数据库性能优化:索引设计与查询调优实践
  • pretrain-Alignment范式的强大与极限——李宏毅大模型2025第五讲笔记
  • CSP集训错题集 第一周
  • MCU软件驱动分离
  • 浏览器中javascript时间线,从加载到执行
  • SP‘24 SSRFuzz论文学习
  • 【算法】day2 双指针+滑动窗口
  • 拆解 AI 大模型 “思考” 逻辑:从数据训练到推理输出的完整链路
  • Axios在鸿蒙应用开发中的使用
  • Go高性能双端队列Deque实战指南
  • StringBuilder 深度解析:数据结构与扩容机制的底层细节
  • Altium Designer(AD24)自学资源介绍
  • cs144 lab0学习总结
  • Playwright MCP浏览器自动化指南
  • 经典俄罗斯方块游戏 | 安卓三模式畅玩,暂时无广告!
  • JVM调优常用命令
  • 文心快码Comate - 百度推出的AI编码助手
  • 做一个RBAC权限
  • Debian13下使用 Vim + Vimspector + ST-LINK v2.1 调试 STM32F103 指南
  • 临床研究三千问——临床研究体系的4个核心(9)
  • 高光谱成像在回收塑料、纺织、建筑废料的应用
  • LeetCode 2348.全0子数组的数目
  • OCSP CDN HTTPS OTA
  • 1.2.3、从“本事务读”和“阻塞别的事务”角度看 Mysql 的事务和锁