如何解决“ AttributeError:模块'google.protobuf.descriptor'没有属性'_internal_create_key”?

时间:2020-05-20 20:28:10

标签: python tensorflow protocol-buffers object-detection-api proto

我在jupyter笔记本中执行from object_detection.utils import label_map_util时遇到了它。实际上是tensorflow对象检测教程笔记本(它随tensorflow对象检测api一起提供) 完整的错误日志:

AttributeError                            Traceback (most recent call last)
<ipython-input-7-7035655b948a> in <module>
      1 from object_detection.utils import ops as utils_ops
----> 2 from object_detection.utils import label_map_util
      3 from object_detection.utils import visualization_utils as vis_util

~\AppData\Roaming\Python\Python37\site-packages\object_detection\utils\label_map_util.py in <module>
     25 import tensorflow as tf
     26 from google.protobuf import text_format
---> 27 from object_detection.protos import string_int_label_map_pb2
     28 
     29 

~\AppData\Roaming\Python\Python37\site-packages\object_detection\protos\string_int_label_map_pb2.py in <module>
     19   syntax='proto2',
     20   serialized_options=None,
---> 21   create_key=_descriptor._internal_create_key,
     22   serialized_pb=b'\n2object_detection/protos/string_int_label_map.proto\x12\x17object_detection.protos\"\xc0\x01\n\x15StringIntLabelMapItem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\x05\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\x12M\n\tkeypoints\x18\x04 \x03(\x0b\x32:.object_detection.protos.StringIntLabelMapItem.KeypointMap\x1a(\n\x0bKeypointMap\x12\n\n\x02id\x18\x01 \x01(\x05\x12\r\n\x05label\x18\x02 \x01(\t\"Q\n\x11StringIntLabelMap\x12<\n\x04item\x18\x01 \x03(\x0b\x32..object_detection.protos.StringIntLabelMapItem'
     23 )

AttributeError: module 'google.protobuf.descriptor' has no attribute '_internal_create_key'

8 个答案:

答案 0 :(得分:81)

这是一个对我有用的解决方案,我不确定它是否对其他人有用。

我通过pip show protobufprotoc --version获得的协议版本是不同的。我升级了pip版本后,pip中的版本有些过时了。

要升级它,请使用pip install --upgrade protobuf

答案 1 :(得分:32)

以下三个命令为我解决了该问题:
pip卸载protobuf python3-protobuf
pip install --upgrade pip
pip install --upgrade protobuf
希望这可以帮助。

答案 2 :(得分:1)

对我来说,问题是我在 libprotobuf3.11,在 protobuf3.15 升级 libprotobuf 为我修复了它。

答案 3 :(得分:1)

这可能是由于您的 IDE(在我的情况下为 PyCharm)和站点包中的 protobuf 和 python3-protobuf 版本不正确。在我的情况下,以下解决了错误:

pip uninstall pyhton3-protobuf
pip uninstall protobuf

然后终于做

pip install protobuf

另外,如果您有 requirements.txt 或 setup.py,请从 pip freeze 中检查 protobuf 版本并在您的 requirements.txt 文件中使用相同的版本

pip freeze

(检查 protobuf 版本,并在 requirements.txt 中使用相同的版本)

protobuf==3.15.6(就我而言,pip freeze 给了我这个 protobuf 版本)

答案 4 :(得分:1)

我在 Anaconda 中也遇到了这个问题。 我安装它:

conda install -c conda-forge streamlit

版本为 3.11.4 的 protobuflibprotobuf

我无法更新 protobuflibprotobuf

我建议先安装“conda install protobuf”然后

conda install -c conda-forge streamlit

我现在获得了 3.14.0 的 protobuflibprotobuf 版本,并且可以正常工作。

答案 5 :(得分:0)

尝试了许多不同的解决方案(我在Mac上工作)后,最适合我的方法是使用以下方法重新安装protobuf:

PROTOC_ZIP=protoc-3.7.1-osx-x86_64.zip
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.7.1/$PROTOC_ZIP
sudo unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
sudo unzip -o $PROTOC_ZIP -d /usr/local 'include/*'
rm -f $PROTOC_ZIP

this article

中突出显示

答案 6 :(得分:0)

对于最近浏览此书的其他人,谷歌库正在使用proto plus,它是python proto消息的包装。使用此辅助功能对我有用(信条:敲打)

import json

import proto

def proto_message_to_dict(message: proto.Message) -> dict:
    """Helper method to parse protobuf message to dictionary."""
    return json.loads(message.__class__.to_json(message))

https://github.com/googleapis/python-memcache/issues/19

答案 7 :(得分:0)

如果您使用 protoc 在与导入文件不同的操作系统中生成特定于语言的绑定文件,也会发生这种情况。例如,

Linux 操作系统

SelectableText(
                        le_li[i],
                        toolbarOptions: ToolbarOptions(
                            selectAll: false,
                            copy: true,
                            cut: false,
                            paste: false),
                        selectionControls: CustomTextSelectionControls(
                            customButton: (start, end) async {
                          pref = await SharedPreferences.getInstance();
                          // Passing the translation to a variable
                          var translation = await translator.translate(
                              le_li[i].substring(start, end),
                              from:
                                  pref.getString('Lang_Short2').substring(0, 2),
                              to: pref.getString('Lang_Short').substring(0, 2));
                          await _showMyDialog2(context,
                              le_li[i].substring(start, end), translation.text);
                        }),
                        textAlign: TextAlign.center,
                        style: TextStyle(
                            fontSize: 20.0, fontWeight: FontWeight.bold),
                        showCursor: true,
                        cursorColor: Colors.red,
                        cursorWidth: 8,
                        onSelectionChanged: onSelectionChanged
                      )

Mac 操作系统

protoc -I=./ --python_out=./ my_module.proto