解决‘NoneType‘ object has no attribute ‘message_types_by_name‘

文章描述了一个使用Wandb库时遇到的AttributeError,该错误与protobuf的message_types_by_name属性缺失有关。解决方案是更新或降级protobuf库以匹配代码需求。作者提到了可能的冲突并提供了相应的解决建议,包括设置PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION环境变量或使用特定版本protobuf。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

AttributeError: 'NoneType' object has no attribute 'message_types_by_name'

  File "/home/andy/.conda/envs/work3/lib/python3.8/site-packages/wandb/sdk/wandb_settings.py", line 39, in <module>
    from wandb.sdk.wandb_setup import _EarlyLogger
  File "/home/andy/.conda/envs/work3/lib/python3.8/site-packages/wandb/sdk/wandb_setup.py", line 22, in <module>
    from . import wandb_manager, wandb_settings
  File "/home/andy/.conda/envs/work3/lib/python3.8/site-packages/wandb/sdk/wandb_manager.py", line 14, in <module>
    from wandb.sdk.lib.proto_util import settings_dict_from_pbmap
  File "/home/andy/.conda/envs/work3/lib/python3.8/site-packages/wandb/sdk/lib/proto_util.py", line 6, in <module>
    from wandb.proto import wandb_internal_pb2 as pb
  File "/home/andy/.conda/envs/work3/lib/python3.8/site-packages/wandb/proto/wandb_internal_pb2.py", line 6, in <module>
    from wandb.proto.v3.wandb_internal_pb2 import *
  File "/home/andy/.conda/envs/work3/lib/python3.8/site-packages/wandb/proto/v3/wandb_internal_pb2.py", line 16, in <module>
    from wandb.proto import wandb_base_pb2 as wandb_dot_proto_dot_wandb__base__pb2
  File "/home/andy/.conda/envs/work3/lib/python3.8/site-packages/wandb/proto/wandb_base_pb2.py", line 6, in <module>
    from wandb.proto.v3.wandb_base_pb2 import *
  File "/home/andy/.conda/envs/work3/lib/python3.8/site-packages/wandb/proto/v3/wandb_base_pb2.py", line 21, in <module>
    __RECORDINFO = DESCRIPTOR.message_types_by_name['_RecordInfo']
AttributeError: 'NoneType' object has no attribute 'message_types_by_name'

水文,记录一个报错,发现用到一个库wandb一直在报错如题,之前也遇到过。

二、解决方案

这个错误通常与protobuf库版本不匹配有关。在较旧的protobuf版本中,没有message_types_by_name属性,而在较新的版本中有。可以更新protobuf库,或者降低代码中所使用的protobuf库的版本。

pip install --upgrade protobuf

跑torchserve或tf serving时也容易出现这个问题,可以更新对应库,确保和protobuf版本匹配。比如上面我升级后还是报错版本问题如下,按照warn说的pip install protobuf==3.20.0建议版本就好啦,或者设置PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION环境变量。

  File "/home/andy/.conda/envs/work3/lib/python3.8/site-packages/google/protobuf/descriptor.py", line 561, in __new__
    _message.Message._CheckCalledFromGeneratedFile()
TypeError: Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
 1. Downgrade the protobuf package to 3.20.x or lower.
 2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).

在这里插入图片描述

Reference

[1] https://github.com/protocolbuffers/protobuf/issues/10075
[2] https://protobuf.dev/news/2022-05-06/#python-updates

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山顶夕景

小哥哥给我买个零食可好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值