一、问题描述
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