protofile.proto:池中已存在具有此名称的文件

问题描述 投票:0回答:5

具有以下结构:

- project1
  - project1.py
  - protofile_pb2.py
  - protofile_pb2_grpc.py
- project2
  - project2.py
  - protofile_pb2.py
  - protofile_pb2_grpc.py

project1.py:

import protofile_pb2.py
...

project2.py:

import protofile_pb2
import project1
...

运行project2.py时,出现此错误:

TypeError: Couldn't build proto file into descriptor pool!
Invalid proto descriptor for file "protofile.proto":
protofile.proto: A file with this name is already in the pool.
python protocol-buffers grpc file-descriptor
5个回答
9
投票

根据此评论,它对我有用:

pip uninstall protobuf
pip install --no-binary protobuf protobuf

7
投票

您正在使用生成的 protofile.proto 的不同版本。确保重新生成 protobuf 文件,它应该可以正常工作。


5
投票

我在Python中部署谷歌云函数时遇到了类似的问题。我的云功能在我的模块中使用不同版本的 .proto 文件(这又是一个私有模块,我想使用 requests.txt 安装)。解决方案是使用纯Python实现而不是使用protobuf的二进制实现。要在云函数或云构建中解决此问题,您可以设置云函数环境变量以使用协议缓冲区的 python 实现。

在 gcloud 云功能部署命令中使用以下选项:

<start of command> --set-env-vars=PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION='python' <your rest of the command>

或者如果您在任何其他环境/操作系统中,只需执行此操作

export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION='python' 

这解决了我的问题。


0
投票

对于 protobuf>=3.20.x

安装 Python 的 Protocol Buffers 库

pip install protobuf
set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python

清理缓存并

restart the kernel

替代品

将 protobuf 包降级到 3.20.x 或更低版本

pip install protobuf=3.11.3

搜索项目中重复出现的

sentencepiece_model.proto
文件。确保只有一份文件副本。


0
投票

我对 2 个类似的

.proto
文件和其中一个
MessageName
有同样的问题 - 并且有错误:

my_v1.proto:5:12: "MessageName" is already defined in file "my_v2.proto".

出现错误是因为我错过了 .proto 文件中的

package
行:

syntax="proto3";

package filename1; # <-- this missed

message MessageName {<...>}

当然2个文件中的包必须是不同的

为了检查编译时的默认池错误,我使用了:

protoc \
--proto_path=${PWD} \
--python_out=${PWD} \
${PWD}/my_v1.proto \
${PWD}/my_v2.proto
© www.soinside.com 2019 - 2024. All rights reserved.