首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >python grpc 从proto文件中生成的两个pb文件的问题 pb没有proto定义的服务?

python grpc 从proto文件中生成的两个pb文件的问题 pb没有proto定义的服务?

提问于 2022-10-30 08:19:07
回答 3关注 0查看 1.9K

我的python环境是3.10 并且已经安装好了 grpcio-tools protobuf grpcio 都是最新的

这是我的proto文件 名字是helloworld.proto

代码语言:python
运行
AI代码解释
复制
syntax = "proto3";

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

可是我执行以下生成的命令

代码语言:js
AI代码解释
复制
python -m grpc_tools -I ./ --python_out=./ --grpc_python_out=. ./helloworld.proto

生成的helloworld.pb2 文件 可以看到没有我想要的服务类

代码语言:js
AI代码解释
复制
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: helloworld.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()




DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10helloworld.proto\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t23\n\x07Greeter\x12(\n\x08SayHello\x12\r.HelloRequest\x1a\x0b.HelloReply\"\x00\x62\x06proto3')

_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'helloworld_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:

  DESCRIPTOR._options = None
  _HELLOREQUEST._serialized_start=20
  _HELLOREQUEST._serialized_end=48
  _HELLOREPLY._serialized_start=50
  _HELLOREPLY._serialized_end=79
  _GREETER._serialized_start=81
  _GREETER._serialized_end=132
# @@protoc_insertion_point(module_scope)

生成的helloworld.pb2_grpc 这个文件看着没有什么问题(我觉得)

代码语言:js
AI代码解释
复制
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc

import helloworld_pb2 as helloworld__pb2


class GreeterStub(object):
    """The greeting service definition.
    """

    def __init__(self, channel):
        """Constructor.

        Args:
            channel: A grpc.Channel.
        """
        self.SayHello = channel.unary_unary(
                '/Greeter/SayHello',
                request_serializer=helloworld__pb2.HelloRequest.SerializeToString,
                response_deserializer=helloworld__pb2.HelloReply.FromString,
                )


class GreeterServicer(object):
    """The greeting service definition.
    """

    def SayHello(self, request, context):
        """Sends a greeting
        """
        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
        context.set_details('Method not implemented!')
        raise NotImplementedError('Method not implemented!')


def add_GreeterServicer_to_server(servicer, server):
    rpc_method_handlers = {
            'SayHello': grpc.unary_unary_rpc_method_handler(
                    servicer.SayHello,
                    request_deserializer=helloworld__pb2.HelloRequest.FromString,
                    response_serializer=helloworld__pb2.HelloReply.SerializeToString,
            ),
    }
    generic_handler = grpc.method_handlers_generic_handler(
            'Greeter', rpc_method_handlers)
    server.add_generic_rpc_handlers((generic_handler,))


 # This class is part of an EXPERIMENTAL API.
class Greeter(object):
    """The greeting service definition.
    """

    @staticmethod
    def SayHello(request,
            target,
            options=(),
            channel_credentials=None,
            call_credentials=None,
            insecure=False,
            compression=None,
            wait_for_ready=None,
            timeout=None,
            metadata=None):
        return grpc.experimental.unary_unary(request, target, '/Greeter/SayHello',
            helloworld__pb2.HelloRequest.SerializeToString,
            helloworld__pb2.HelloReply.FromString,
            options, channel_credentials,
            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

可以看到这个pb2文件没有我在proto文件定义的服务类 在编写代码的时候无法调用

我在github上面看python grpc的例子的时候 寻找到了相似的pb2文件(以下是github寻找到的pb2文件)

代码语言:js
AI代码解释
复制
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: helloworld.proto
"""Generated protocol buffer code."""
from google.protobuf.internal import builder as _builder
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()




DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3')

_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'helloworld_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:

  DESCRIPTOR._options = None
  DESCRIPTOR._serialized_options = b'\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW'
  _HELLOREQUEST._serialized_start=32
  _HELLOREQUEST._serialized_end=60
  _HELLOREPLY._serialized_start=62
  _HELLOREPLY._serialized_end=91
  _GREETER._serialized_start=93
  _GREETER._serialized_end=166
# @@protoc_insertion_point(module_scope)

可见他的pb2文件也没有服务类

但是他确多了一个helloworld.pb2.pyi的文件(平常我们的是py后缀) 里面有定义的服务类

代码语言:js
AI代码解释
复制

from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Optional as _Optional

DESCRIPTOR: _descriptor.FileDescriptor

class HelloReply(_message.Message):
    __slots__ = ["message"]
    MESSAGE_FIELD_NUMBER: _ClassVar[int]
    message: str
    def __init__(self, message: _Optional[str] = ...) -> None: ...

class HelloRequest(_message.Message):
    __slots__ = ["name"]
    NAME_FIELD_NUMBER: _ClassVar[int]
    name: str
    def __init__(self, name: _Optional[str] = ...) -> None: ...

可能这里的文章是关键 他提到了pyi文件 但是我没看明白

Update third_party/protobuf to 3.21.4 by yashykt · Pull Request #30377 · grpc/grpc · GitHub

我是哪里出问题了嘛?感谢大家解答!

已邀请
等3人回答

回答 1

liquid

发布于 2024-03-17 04:28:20

你的正式业务部署用的是哪个url,就配置哪个。另外配置没问题的话就需要检查防火墙是否放通了

和开发者交流更多问题细节吧,去 写回答
相关文章
c++ auto类型_auto C++
编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易(特别是模板中),有时候根本做不到。为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应某种特定的类型说明符(例如 int)不同。auto 让编译器通过初始值来进行类型推演。从而获得定义变量的类型,所以说 auto 定义的变量必须有初始值。
全栈程序员站长
2022/09/30
8810
auto是什么_auto C++
auto让编译器通过初始值来推算变量的类型——–因此,auto定义的变量必须有初始值.
全栈程序员站长
2022/10/05
5410
【C++】 C++入门 — auto关键字
编程时常常需要把表达式的值赋给变量,这就要求在声明变量时清楚地知道表达式的类型。然而要做到这一点并非那么容易,有时甚至做不到。如下:
叫我龙翔
2024/02/02
1340
【C++】 C++入门 — auto关键字
【C++入门】auto关键字
在C语言中auto修饰的变量,是具有自动存储器的局部变量,但因为局部变量默认类别默认是auto修饰导致一直没有人去使用它。
薄荷冰
2024/01/22
1470
【C++入门】auto关键字
【c++入门】引用,内联函数,auto
引用是一个重要的概念,它提供了一种方式,通过它可以让两个不同的标识符(变量名、参数名等)引用同一个数据对象
用户11029103
2024/03/24
1370
【c++入门】引用,内联函数,auto
为什么虚函数在编译期间无法确定下来
看上面的代码就很容易知道,编译器无法在编译期判断 bp->func() 调用的是 Base::func() 还是 Derived::func(),所以虚函数在编译期间是无法确定下来的。
ClearSeve
2022/02/11
4250
C++ auto 关键字的使用
早在C++98标准中就存在了auto关键字,那时的auto用于声明变量为自动变量,自动变量意为拥有自动的生命期,这是多余的,因为就算不使用auto声明,变量依旧拥有自动的生命期:
狼啸风云
2020/07/14
4.9K0
UE5中 uDraper 插件无法编译 C++ 工程的修复
uDraper是用来做布料模拟的插件。现在出现的问题是安装了 uDraper 之后无法编译 C++ 工程。经典报错就是:
太阳影的社区
2022/09/23
1.7K0
UE5中 uDraper 插件无法编译 C++ 工程的修复
C++中auto关键字用法
auto 是 C++11 引入的关键字,用于让编译器自动推导变量的类型。它可以用于声明变量、函数返回类型、以及范围迭代器等地方。
Linux兵工厂
2024/02/27
6390
C++中auto关键字用法
如何处理C++编译webrtc无法成功获取sdp的问题?
近期我们在编译WebRTC时碰到了一些问题,通过C++编译WebRTC项目,获取sdp的数据为空。我们使用windows api调用go服务端接口,接收到的数据为空。
TSINGSEE青犀视频
2021/06/16
8800
C++条件编译 | 条件编译
在C++中,在进行编译时对源程序中的每一行都要编译,但是有时希望程序中某一部分内容只在满 足一定条件时才进行编译,也就是指定对程序中的 一部分内容进行编译的条件,如果不满足这个条 件,就不编译这部分内容,这就是条件编译。
小林C语言
2020/12/01
2.5K0
C++条件编译 | 条件编译
C++从入门到精通——auto的使用
C++的auto关键字用于自动推导变量的类型,让编译器根据变量的初始化表达式来确定其类型。使用auto可以简化代码,并且可以在某些情况下提高代码的可读性和灵活性。
鲜于言悠
2024/04/02
6070
【C++】内联函数&auto&范围for循环&nullptr
在C语言中,我们为了减少栈帧的开销,我们可以通过宏函数,没有栈帧消耗,在预处理的阶段就被替换了,就没有栈帧的消耗了
平凡的人1
2022/11/15
7230
【C++】内联函数&auto&范围for循环&nullptr
C++ 温习笔记(3) - auto_ptr,string
auto_ptr用法: 1. 需要包含头文件memory。 2. Constructor:explicit auto_ptr(X* p = 0) throw(); 将指针p交给auto_ptr对象托管。 3. Copy constructor:auto_ptr(const auto_ptr&) throw(); template auto_ptr(const auto_ptr& a) throw(); 指针的托管权会发生转移。 4. Destructor: ~auto_ptr(); 释放指针p指向的空间。 5. 提供了两个成员函数 X* get() const throw(); //返回保存的指针 6. 对象中仍保留指针 X* release() const throw(); //返回保存的指针,对象中不保留指针
干货满满张哈希
2021/04/12
4190
Android 编译C++
  在开发过程中,有一些底层库,算法、加解密之类的功能,不是用Java写的,而是C或者C++,而我们需要在Android工程中调用C/C++的函数达到理想的要求,那么这个时候你就需要知道怎么使用它们。
晨曦_LLW
2022/11/23
1.7K0
Android 编译C++
深入解析C++的auto自动类型推导
关键字auto在C++98中的语义是定义一个自动生命周期的变量,但因为定义的变量默认就是自动变量,因此这个关键字几乎没有人使用。于是C++标准委员会在C++11标准中改变了auto关键字的语义,使它变成一个类型占位符,允许在定义变量时不必明确写出确切的类型,让编译器在编译期间根据初始值自动推导出它的类型。这篇文章我们来解析auto自动类型推导的推导规则,以及使用auto有哪些优点,还有罗列出自C++11重新定义了auto的含义以后,在之后发布的C++14、C++17、C++20标准对auto的更新、增强的功能,以及auto有哪些使用限制。
爱分享
2024/04/11
4070
深入解析C++的auto自动类型推导
Linux编译C++
1)此时脚本开始运行 2)选择python3解释编译ycm文件 此时脚本文件会问你是选择python2还是python3来编译ycm文件?我在这里选择3,在此之前请安装python3 3)开始安装插件 4)此时vimplus就安装成功了
承苏凯
2020/07/24
23K0
java编译通过,为什么运行却提示找不到或无法加载主类?
java编译通过,为什么运行却提示找不到或无法加载主类? https://www.zhihu.com/question/36537093 这边提供一个关于程序中含有package关键字,使用“终端”运行程序时出现“找不到或无法加载主类”,而使用Eclipse软件可以正常运行程序的可能解决办法。 例如程序名为HelloWorldTest.java,程序中含有package helloWorld语句,而该包位于javatest目录下,即javatest/helloWorld/HelloWorldTest.jav
landv
2018/05/24
2.2K0
有auto为什么还要decltype ?详解decltype的用法[通俗易懂]
在中,我介绍了auto的用法及其实际编程中的应用,既然auto可以推导变量的类型,为什么C++11还引进decltype类型说明符呢?关于这一点,C++ Primer中这样写道:有时希望从表达式的类型推断出要定义的变量的类型(这一点auto可以做到),但是不想用该表达式的值初始化变量(auto依赖这一点才能推导类型)。如果你还是不明白,请开下面的例子:
全栈程序员站长
2022/10/01
9160
解析C++内联函数与auto关键字
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
Yui_
2024/10/16
900
解析C++内联函数与auto关键字

相似问题

Webhook 监听预览时能接收数据,上线后却不能?

151

flash播放器监听fullscreen事件?

1316

拉流事件监听有时不回调?

0138

JavaFX的WebView控件如何监听href事件?

0806

tbs文件预览TbsReaderView滑动事件无法监听?

0145
相关问答用户
腾讯云
腾讯鹊桥连接器 | 高级产品经理擅长2个领域
鹅厂
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档