ImportError:无法从“google.protobuf.internal”导入名称“builder”

Bac*_*sei 58 python

我正在关注这个视频。22点22分,发现这段代码有错误:

!python {SCRIPTS_PATH + '/generate_tfrecord.py'} -x {IMAGE_PATH + '/train'} -l {ANNOTATION_PATH + '/label_map.pbtxt'} -o {ANNOTATION_PATH + '/train.record'}
!python {SCRIPTS_PATH + '/generate_tfrecord.py'} -x{IMAGE_PATH + '/test'} -l {ANNOTATION_PATH + '/label_map.pbtxt'} -o {ANNOTATION_PATH + '/test.record'}
Run Code Online (Sandbox Code Playgroud)

发布具体的错误消息:

Traceback (most recent call last):
  File "D:\info\1 Master\2 semster\RealTimeObjectDetection-main\Tensorflow\scripts\generate_tfrecord.py", line 29, in <module>
    from object_detection.utils import dataset_util, label_map_util
  File "C:\Users\bachir\PycharmProjects\pythonProject\venv\lib\site-packages\object_detection\utils\label_map_util.py", line 29, in <module>
    from object_detection.protos import string_int_label_map_pb2
  File "C:\Users\bachir\PycharmProjects\pythonProject\venv\lib\site-packages\object_detection\protos\string_int_label_map_pb2.py", line 5, in <module>
    from google.protobuf.internal import builder as _builder
ImportError: cannot import name 'builder' from 'google.protobuf.internal' (C:\Users\bachir\PycharmProjects\pythonProject\venv\lib\site-packages\google\protobuf\internal\__init__.py)
Run Code Online (Sandbox Code Playgroud)

首先我尝试下载一些丢失的软件包,但同样的问题,我想帮忙

小智 107

按着这些次序:

  1. 安装最新的 protobuf 版本(在我的例子中是 4.21.1)

pip install --upgrade protobuf

  1. 复制builder.py.../Lib/site-packages/google/protobuf/internal计算机上的另一个文件夹(假设为“文档”)
  2. 安装与您的项目兼容的 protobuf 版本(对我来说是 3.19.4)

pip install protobuf==3.19.4

  1. builder.py从(比方说“文档”)复制到Lib/site-packages/google/protobuf/internal
  2. 运行你的代码

  • protobuf 是这个世界上最糟糕的软件,每个人都依赖它,它的每个版本都破坏了它自己的 API。 (11认同)
  • 你刚刚救了我的显示器和键盘。我正在阅读本教程(https://tensorflow-object-detection-api-tutorial.readthedocs.io/en/latest/install.html#tensorflow-object-detection-api-installation)。最后你的解决方案起作用了! (5认同)
  • 哇,聪明的解决方案! (3认同)
  • 多么好的解决方案啊... (3认同)
  • protobuff 本身就是一个黑客,可以提供跨通信的黑客,这就是下一个黑客,该死的 (2认同)

mar*_*c88 35

您需要升级到最新版本的软件包protobuf

pip install --upgrade protobuf

原因是自 Protobuf v3.20.0 以来,Python 类得到了简化。发行说明中直接写道:

Protobuf python 生成的代码被简化。描述符和消息类的定义现在是在internal/builder.py 中动态创建的。消息类的插入点被丢弃。

这解释了为什么生成的 Python 代码现在引用一个builder模块,如果您尚未更新到最新版本的protobuf包,则无法找到该模块。发行说明中没有对此进行解释,但我自己验证了如果升级软件包它就可以工作protobuf


小智 21

由于某种原因,从 TensorFlow 创建的包builder.py中缺少该文件protobuf。解决方法是简单地将 builder.py 的最新副本从protobuf存储库复制到本地驱动器中

wget https://raw.githubusercontent.com/protocolbuffers/protobuf/main/python/google/protobuf/internal/builder.py -O [PROTOBUF_PATH]/lib/python3.8/site-packages/google/protobuf/internal/builder.py
Run Code Online (Sandbox Code Playgroud)


小智 10

解决方案分两步

  1. pip uninstall protobuf

  2. pip install protobuf==4.21

  • tf 目前与该版本不兼容。可行的解决方案是得分最高的解决方案 (2认同)

小智 5

就像维克多回答的那样。由于某种原因使用tensforflow时,安装protobuf时相关包中缺少builder.py。

https://raw.githubusercontent.com/protocolbuffers/protobuf/main/python/google/protobuf/internal/builder.py

复制并粘贴此代码并将其制作为 .py,然后将该文件粘贴到 {your env location}/site-packages/google/protobuf/internal/builder.py

一切顺利。


mux*_*ian 1

我可以通过不使用最新版本的 protoc 编译器编译 .proto 文件,而是使用旧版本 v3.19.4 来解决该问题(请参阅https://github.com/protocolbuffers/protobuf/releases)。