如何解决VS Code中Python gRPC生成类的Intellisense补全失效问题
问题原因
默认gRPC Python生成代码的特性会直接导致补全失效:常规protoc命令生成的*_pb2.py代码通过protobuf运行时的动态元类构造类属性,VS Code默认使用的Pylance语言服务器做静态代码分析时,无法识别运行时动态生成的属性定义,自然无法弹出补全。如果写服务方法时不给request参数加明确类型标注,补全失效的问题会更明显。
解决步骤
不需要安装第三方插件,按以下操作配置即可让Intellisense正常生效:
- 先把grpcio-tools升级到1.48.0及以上版本,低版本不支持自动生成类型桩文件:
pip install --upgrade grpcio-tools - 修改原有编译命令,新增
--pyi_out=.参数,编译时同步生成静态类型提示文件(.pyi后缀):python -m grpc_tools.protoc -I../../pb --python_out=. --grpc_python_out=. --pyi_out=. ../../pb/demo.proto
执行完成后,生成代码的同目录下会出现*_pb2.pyi、*_pb2_grpc.pyi两个文件,Pylance会自动识别这类类型桩文件,读取proto定义的所有结构信息。 - 编写服务端逻辑时,给方法的
request参数加上对应生成类的类型注解,示例:from demo_pb2 import HelloRequest from demo_pb2_grpc import HelloServiceServicer class HelloService(HelloServiceServicer): def SayHello(self, request: HelloRequest, context): # 此处输入request. 即可正常弹出所有proto定义的属性补全 name = request.name - 检查VS Code基础配置:按
Ctrl+,打开设置面板,搜索python.languageServer,确认选中的语言服务器为Pylance,旧版Jedi、微软早期语言服务器对pyi类型桩的兼容性差,会导致补全失效。
注意:不要手动修改自动生成的
_pb2.py、_pb2_grpc.py文件,只要保证pyi文件和对应py文件在同一目录下,补全就会持续生效。后续proto文件修改后,重新执行带--pyi_out参数的编译命令即可同步更新类型提示。
内容的提问来源于stack exchange,提问作者faridghar
相关产品推荐
相关产品推荐

