下载源代码:地址

安装proto

#下载:protoc-3.9.1-linux-x86_64.zip

unzip protoc-3.9.1-linux-x86_64.zip -d protoc-3.9.1-linux-x86_64 # 解压

mv protoc-3.9.1-linux-x86_64 /usr/local/protoc # 移动

ln -s /usr/local/protoc/bin/protoc /usr/bin/protoc # 建立软连接

protoc --version # 测试

安装python的protof 扩展

protoc-3.9.1-linux-x86_64.zip 3 下载

unzip protobuf-python-3.9.1.zip

cd protobuf-3.9.1/python

python3 setup.py build

python3 setup.py test

python3 setup.py install

pip list # 参考protobuf 3.9.1

定义数据类型

syntax = "proto3";

package tutorial;

message searchRequest {

string query = 1;

int32 page_number = 2;

int32 result_per_page = 3;

enum Corpus {

UNIVERSAL = 0;

WEB = 1;

IMAGES =2;

LOCAL = 3;

NEWS = 4;

PRODUCTS = 5;

VIDEO = 6;

}

Corpus corpus = 4;

}

message Person {

string name = 1;

int32 id = 2;

string email = 3;

enum PhoneType {

HOME = 0;

MOBILE = 1;

WORK = 2;

}

message PhoneNumber {

string number = 1;

PhoneType type = 2;

}

repeated PhoneNumber phones = 4;

}

message AddressBook {

repeated Person people = 1;

}

protoc --python_out=./ ./test.proto # 编译文件

测试案例

from google.protobuf import json_format

from scrapy_crawl.deal.service.proto.test_pb2 import *

person = Person()

person.id = 1

person.name = 'vic'

person.email = '3264245@qq.com'

person.phones.add(number='15901780', type=Person.MOBILE)

print(person.SerializeToString())

person1 = Person()

p1 = person1.ParseFromString(person.SerializeToString())

print(p1)

j1 = json_format.MessageToDict(person1, True)

print(j1)

person2 = Person()

json_format.Parse(json_format.MessageToJson(person1, True), person2)

print(person2)

# 下面是执行结果

b'nx03vicx10x01x1ax0e3264245@qq.com"x0cnx0815901780x10x01'

37

{'name': 'vic', 'id': 1, 'email': '3264245@qq.com', 'phones': [{'number': '15901780', 'type': 'MOBILE'}]}

name: "vic"

id: 1

email: "3264245@qq.com"

phones {

number: "15901780"

type: MOBILE

}

grpc服务

定义test.proto

syntax = "proto3";

package helloworld;

message HelloRequest {

string name = 1;

}

message HelloReply {

string message = 1;

}

service Greeter {

rpc SayHello (HelloRequest) returns (HelloReply) {}

rpc SayHelloAgain(HelloRequest) returns (HelloReply) {}

}

生产gRPC代码

python3 -m grpc_tools.protoc -I . --python_out=. --grpc_python_out=. helloworld.proto

创建server

import time

from concurrent import futures

from scrapy_crawl.deal.service.proto.test_pb2 import *

from scrapy_crawl.deal.service.proto.test_pb2_grpc import *

class Greeter(GreeterServicer):

def SayHello(self, request, context):

return HelloReply(message='hello world, %s' % request.name)

def SayHelloAgain(self, request, context):

return HelloReply(message='hello world, %s' % request.name)

def main():

print("------")

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))

add_GreeterServicer_to_server(Greeter(), server)

server.add_insecure_port("[::]:50051")

server.start()

try:

while True:

time.sleep(100)

except KeyboardInterrupt:

print("stop")

server.stop(0)

main()

创建client

from scrapy_crawl.deal.service.proto.test_pb2_grpc import *

def run():

channel = grpc.insecure_channel("localhost:50051")

stub = GreeterStub(channel=channel)

r = stub.SayHello(HelloRequest(name='vic'))

print("greeter client received:%s" % r.message)

r = stub.SayHelloAgain(HelloRequest(name='baby'))

print("Greeter client received: %s" % r.message)

run()

错误

test_pb2_grpc 引入了test_pb2文件,是绝对路径引入的,修改为先对路径即可

参考文档:参考1

go调用python3_在python3中使用google的protobuf以及gRPC-Go语言中文社区相关推荐

  1. python编程小案例_用Python3编程写第一个小案例!-Go语言中文社区

    用Python3编程第一步! 今天博主跟大家聊一聊如何使用Python3编程第一步!!不喜勿喷,如有建议欢迎补充.讨论! Come on! 在前面的几篇文章中我们已经学习了一些Python3 的基本语 ...

  2. kubernetes中mysql乱码_在kubernetes中部署tomcat与mysql集群-Go语言中文社区

    在kubernetes中部署tomcat与mysql集群之前必须要有以下这些基础: 1. 已安装.配置kubernetes 2. 集群中有tomcat与mysql容器镜像 3. 有docker基础 具 ...

  3. java awt run_Java中awt基本组件及其使用方法-Go语言中文社区

    1,按钮 此类创建一个标签按钮.当按下该按钮时,应用程序能执行某项动作.它有两种构造方法: public Button() 构造一个标签字符串为空的按钮. public Button(String l ...

  4. rust的矿坑_转: Rust中的Pin详解 【Rust语言中文社区】

    Rust中的Pin详解 原创 automanyang Rust语言中文社区 昨天 https://mp.weixin.qq.com/s/PjctbPbyR5OeaqTHZdB5uQ 相关概念 Pin ...

  5. vue 调用共众url_vue单页面,在微信公众号支付中遇到的URL未注册BUG解决方法-Go语言中文社区...

    今天在做微信公众号支付的时候,遇到一个bug,在当前支付页面点击支付,就会报错,提示当前页面的URL未注册.如下图: 但是,这个URL我们是在后台微信公众号配置了的,所以说不会出错. 但是我们刷新一次 ...

  6. go 调用winapi_如何在go中调用windows api-Go语言中文社区

    1.cgo环境搭建 初入go坑,记录一次工作中需要封装windows api 的过程.既然是go调用C++那么首先要配置cgo的环境了.要使用CGO特性,需要安装C/C++构建工具链,在macOS和L ...

  7. python集合可以修改吗_修改包含Python3中的集合的集合列表-问答-阿里云开发者社区-阿里云...

    我试图创建一个以元组为元素的列表.每个元组都有4个整数.前两个整数是对2个range进行压缩的结果,而其他2个则是对2个不同的整数进行压缩的结果. 我正在使用此代码创建元组和最终列表,这些列表是从笛卡 ...

  8. shell脚本和python脚本和go脚本的区别_Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例-Go语言中文社区...

    NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有: 1)标准输入.标准输出及标准错误输出的接口: child.stdin 获取标准输入 child.stdout 获取标准输出 chi ...

  9. mac装python3问题_Mac下使用homebrew安装Python3问题-Go语言中文社区

    在运行Python项目时需要Python3. 那么就安装Python3,使用homebrew安装,命令如下: brew install python3 安装成功即可使用. 由于不知道什么时候已经安装了 ...

最新文章

  1. 【原译】在amazon kindle上安装Metasploit
  2. 【NLP】BERT 模型与中文文本分类实践
  3. 第1章python基础语法1
  4. Java FlatMapFunction in Spark: error: is not abstract and does not override abstract method解决方案
  5. 工业互联网二级节点建设_建设者还是二传手?
  6. 用SQL实现统计报表中的“小计”和“合计”
  7. nginx windows启动停止_Nginx之3抛砖引玉 - (目录索引)
  8. 这台计算机似乎没有安装操作系统_【每日一练】计算机一级考试(一)
  9. ActiveMQ(4) ActiveMQ JDBC 持久化 Mysql 数据库
  10. DSP学习(3)—— DSP调试与追踪
  11. Google退出中国的三大原因和四大后果(转载)
  12. 常量的分类_基本数据类型
  13. 桌面应用程序与web应用程序
  14. 一图看懂RTB广告竞价原理,原来这就是实时竞价
  15. 计算机工程学院团总支学生会,凝聚团队力量,展现青春活力——计算机工程学院团总支学生会开展学生干部素质拓展活动...
  16. ubuntu1404 安装 ppsspp
  17. iOS: UIScrollView的属性zooming
  18. c++如何批量修改文件后缀名
  19. windows10 RocketMQ启动 mqbroker 异常
  20. ChinaJoy揭晓十大网游盗号木马黑榜

热门文章

  1. ftp服务器复制粘贴文件夹,ftp服务器复制粘贴文件夹
  2. c++中outtextxy_第12章 坚持一百秒(《C和C++游戏趣味编程》配套教学视频)
  3. java单纯形法_单纯形法 - fjzzq2002 - 博客园
  4. linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析
  5. cat3 utp是不是网线_小科普 | 网线也有高低?聊聊网线的差别
  6. 机器人码垛手持式编程_FANUC机器人码垛编程讲解
  7. 腾讯TIM自动回复内容怎么自定义添加
  8. 怎么禁止开机启动nvidia
  9. 如何实现多路海康大华等RTSP数据转RTMP推送
  10. div+css 单行或者多行超出文本,数字,字母长度自动省略