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

下载源代码:地址

安装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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

static变量 java

static 变量java static 是java中的一个关键字,单词本身是静态的含义。一个类的成员包含变量、方法、构造方法 、代码块和内部类,static可以修饰除了构造方法以外的所有成员使用static修饰的成员称为静态成员,是属于某个类的;而不…

java static方法

static方法 1、static方法的作用访问static变量和static方法2、static方法的调用方式通过类名调用、通过对象名来访问3、不可以静态方法中不可以访问非静态变量 静态方法中不可以访问非静态方法 静态方法中不可以访问this原因:加载类的时候就加载静态变量和静态方法…

保存验证码的方法_selenium自动化测试:6.验证码处理

0.前言如果可以的话,请先关注(专栏和账号),然后点赞和收藏,最后学习和进步。你的支持是我继续写下去的最大动力,个人定当倾囊而送,不负众望。谢谢!!!1.前提基…

非root用户组启动sftp_如何在 Debian 10 中配置 Chroot 环境的 SFTP 服务 | Linux 中国

SFTP 是最常用的用于通过 ssh 将文件从本地系统安全地传输到远程服务器的方法https://linux.cn/article-12186-1.html作者:Pradeep Kumar译者:郑SFTP 意思是“安全文件传输协议(Secure File Transfer Protocol)” 或 “SSH 文件传输协议(SSH File Transf…

java权限修饰符

java权限修饰符 java一共有四种访问控制符1、private 表示私有,只有自己类能访问2、default 表示没有修饰符修饰,只有同一个报的类能访问3、protected 表示可以被同一个包的类以及其他包中的子类访问4、public 表示可以被该项目的所有包中的所有类访问类…

python增删改查csv文件_【练习】Python第四次:实现对文件的增删改查

import os #os包含改名和删除文件函数def file_handler(backend_data,res None,typefetch):if type fetch:with open(haproxy.conf, r) as read_f:tag False #找到标志ret []for read_line inread_f:if read_line.strip() backend_data: #匹配到数据tag Truecontinueif tag …

java封装练习

java封装练习 /*** 以面向对象的思想,编写自定义类描述图书信息。设定属性包括:书名、作者、出版社名、价格* 方法包括:信息介绍** 要求:* 1、设置属性的私有访问权限,通过公有的get、set方法实现对属性的访问* 2、限…

接口自动化测试_Python自动化测试学习路线之接口自动化测试「模块四」

01.接口自动化测试概念(接口测试的定义与意义;接口测试的实现方式和接口自动化的实现流程)02.HTTP协议(通信协议原理;HTTP与HTTP协议详解(请求,响应,请求方法,状态码)、session、cookie、token鉴权)03.JSON数据格式(JSON与XML的比较;JSON的语法规则;JSON的数据类型)…

java继承实现

java继承实现 /*** 继承*/ public class Animal { //默认animal集成objectprivate String color;private int age;public Animal(){super();}public Animal(String color,int age){this.color color;this.age age;}public void eat(){System.out.println("吃饭"…

spss多元非线性曲线拟合_快速掌握SPSS数据分析

在和SPSSAU的用户交流中,我们发现本是非常简单的数据分析原理以及软件工具,结果非常多的同学完全不会SPSS数据分析,不知道如何学习,即使学过相关原理,但对具体数据进行分析时也有非常多问题。这不禁让我们思考&#xf…

继承情况下构造方法的调用过程-java

继承情况下构造方法的调用过程-java super关键字:可以看做是直接父类对象的引用。每个子类对象都会有一个super引用 指向其直接父类对象。super可以:1、调用成员变量 super.color 2、调用成员方法 super.show 3、调用构造方法 super&#xff0…

重写equals方法---java

重写equals方法---java /*** 重写equals方法*/ public class Animal {String color;private int age;public boolean equals(Object obj){Animal other (Animal)obj;//如果参数是null,直接返回falseif (objnull){return false;}//如果两个变量指向同一个空间&…

python循环函数怎么改变变量_python:循环定义多个变量

我们可能会时长碰到这样一个场景,计算得到一个非固定值,需要根据这个值定义相同数量个变量。实现方式的核心是exec函数,exec函数可以执行我们输入的代码字符串。exec函数的简单例子:>>>exec (print "hello world")hello w…

多态--Java

多态--Java 多态指的是同一个方法调用,由于对象不同可能会有不同的行为。编译器类型指的是‘’左边的类型,运行时类型指的是‘’右边的类型。当有继承关系时,可能发生编译器 和运行期类型不同的情况,即编译期类型是父类类型&…

tex文件用什么软件打开_pdf怎么打开?用什么软件打开pdf?

时光荏苒,转眼2020年还有几个月就结束了,我们公司最近举办了"2020年工作季度总结"大会,领导要求每个部门的不同职员要写一份总结,讲述自己这段时间的经验和教训。而我作为办公室文秘,负责收集他们的个人总结…

Java一个小练习----String类型转换int类型

Java一个小练习 把字符串str分割程String数组,然后转换成int数组,排序 String str "123 345 89 93 2 6573 223" 然后在拼接成一个字符串如下: "2 89 93 123 223 345 6573" /*** String str "123 345 89 93 2…

高级语言的编译过程和解释过程_进来了解一下C语言真正的编译过程看你掌握了吗?...

C语言 前言说实话,很多人做了很久的C/C,也用了很多IDE,但是对于可执行程序的底层生成一片茫然,这无疑是一种悲哀,可以想象到大公司面试正好被问到这样的问题,有多悲催不言而喻,这里正由于换工作的缘故&…

final关键字---Java

final关键字---Java final关键字的作用1、修饰变量:被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。2、修饰方法:该方法不可被子类重写,但是可以被重载。3、修饰类:修饰的类不能被继承。注意:1、…

以30字符宽居中输出python字符串_Python3 字符串

isdigit 和 isnumeric的区别?def dn():dgt[]num[]c0for c in range(2**16):chchr(c)if ch.isdigit():dgt.append(ch)if ch.isnumeric():num.append(ch)print(digits:,dgt)print(numeric:,num)dn()以上代码执行输出结果为:digits: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ,…

抽象类和抽象方法----java

抽象类和抽象方法----java 抽象方法:使用abstract修饰的方法,没有方法体,只能声明。定义的是一种“规范”,就是告诉子类必须要给抽象 方法提供具体的实现。抽象类:使用abstract修饰的类。通过abstract方法定义规范&am…