参考Protocol Buffer API部分:
与生成 Java 和 C++ 协议缓冲区代码不同,Python 协议缓冲区编译器不会直接为您生成数据访问代码。相反,它会为您的所有消息、枚举和字段以及一些神秘的空类生成特殊描述符,每种消息类型一个......
和,
在加载时,GeneratedProtocolMessageType
元类使用指定的描述符来创建处理每种消息类型所需的所有 Python 方法,并将它们添加到相关类中。然后,您可以在代码中使用完全填充的类。
因此,您可以使用生成的类来创建对象及其字段,如下所示:
p1 = primitive_types_pb2.PrimitiveType()
p1.int_value = 1234
对于您的用例,您可以使用timestamp_pb2.Timestamp.GetCurrentTime()。
或者,您可以参考Timestamp以及timestamp_pb2.Timestamp.CopyFrom():
now = time.time()
seconds = int(now)
nanos = int((now - seconds) * 10**9)
timestamp = Timestamp(seconds=seconds, nanos=nanos)
p1 = primitive_types_pb2.PrimitiveType()
p1.timestamp_value.CopyFrom( timestamp )
对于其他用例,您可能会对其他google.protobuf.timestamp_pb2 API 感兴趣。
这是一个完整的工作示例 ( primitive_types.proto
):
import time # For Timestamp.CopyFrom(). See commented code below
import primitive_types_pb2
from google.protobuf import timestamp_pb2
# serialization
p1 = primitive_types_pb2.PrimitiveType()
# Alternative to GetCurrentTime()
# now = time.time()
# seconds = int( now )
# nanos = int( (now - seconds) * 10**9 )
# timestamp = timestamp_pb2.Timestamp( seconds=seconds, nanos=nanos )
# p1.timestamp_value.CopyFrom( timestamp )
p1.timestamp_value.GetCurrentTime()
serialized = p1.SerializeToString()
# deserialization
p2 = primitive_types_pb2.PrimitiveType()
p2.ParseFromString( serialized )
print( p2.timestamp_value )
输出:
seconds: 1590581054
nanos: 648958000
参考: