iInstance不';使用python protobuf v2.6.1的反射时不起作用

iInstance不';使用python protobuf v2.6.1的反射时不起作用,python,protocol-buffers,Python,Protocol Buffers,我使用的是python protobuf v2.6.1的动态反射功能,其功能如下: # initilization code des_db_ = descriptor_database.DescriptorDatabase() des_pool_ = descriptor_pool.DescriptorPool(des_db_) fdp = descriptor_pb2.FileDescriptorProto.FromString(

我使用的是python protobuf v2.6.1的动态反射功能,其功能如下:

# initilization code

        des_db_ = descriptor_database.DescriptorDatabase()
        des_pool_ = descriptor_pool.DescriptorPool(des_db_)


        fdp = descriptor_pb2.FileDescriptorProto.FromString(
            a_pb_module.DESCRIPTOR.serialized_pb)
        des_db_.Add(fdp)


def unpack_PB_msg(type_name, pb_msg_str)
        factory = message_factory.MessageFactory(des_pool_)
        msg_class = factory.GetPrototype(des_pool_.FindMessageTypeByName(type_name))

        pb_msg = msg_class()
        pb_msg.ParseFromString(pb_msg_str)

       return pb_msg
但是下面的客户端代码将失败

hello = Hello_msg()
hello_str = hello.SerializeToString()
hello2 = unpack_PB_msg(Hello_msg.DESCRIPTOR.full_name, hello_str)

hello3 = Hello_msg()
hello3.CopyFrom(hello2)# failed here!!!
错误消息是:

hello3.CopyFrom(hello2)
  File "C:\Localdata\Python27\lib\site-packages\google\protobuf\message.py", line 119, in CopyFrom
    self.MergeFrom(other_msg)
  File "C:\Localdata\Python27\lib\site-packages\google\protobuf\internal\python_message.py", line 971, in MergeFrom
    "expected %s got %s." % (cls.__name__, type(msg).__name__))
TypeError: Parameter to MergeFrom() must be instance of same class: expected Hello_msg got Hello_msg.
似乎CopyFrom失败是因为isinstance失败了

  def MergeFrom(self, msg):
    if not isinstance(msg, cls):
      raise TypeError(
          "Parameter to MergeFrom() must be instance of same class: "
          "expected %s got %s." % (cls.__name__, type(msg).__name__))
当打印hello2和hello3的数据类型时,它们似乎是不同的

hello2 : <class 'Hello_msg'>
hello3 : <class 'a_pb_module.Hello_msg'>
hello2:
hello3:

这是protobuf臭虫吗?还是我做错了什么?

这可能会帮助到某人。 我也犯了同样的错误

TypeError:MergeFrom()的参数必须是同一类的实例:应为Hello\u msg got Hello\u msg。

当我在两个不同的路径上两次导入同一个类时,它会导致在不同的路径上导入两个不同的类(尽管它们可能具有相同的类名,但Python将它们视为两个完全不同的类(检查类的ID,您应该会发现它们是不同的))


要解决此问题,您需要确保同一类(Hello_msg)只导入一次

cls不是在MergeFrom中定义的,也不是通过self调用的。cls是cls全局的吗?@Obj3ctiv3_c88,你说“通过self调用。cls是cls全局的”是什么意思?@Obj3ctiv3_c88-如果你找到源代码(
../site packages/google/protobuf/internal/python_message.py
),它表明
MergeFrom
是一个函数,在函数中定义(
def\u addmergefromthod(cls)