Со ссылкой на Раздел 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
Ссылки: