Я хочу написать сценарий для заполнения значений буферов протокола значениями, указанными в файле JSON, не зная, что находится в файле .proto.
А как насчет скомпилированного кода protobuf на Python?
Что вы имеете в виду под «скомпилированным»? Если у вас уже есть результат protoc, вы можете подключить эту библиотеку в свой код и использовать ее, не так ли?
Я использовал файл python, выдаваемый протоколом, но похоже, что вам нужно знать имена переменных и т. д. Мне было интересно, есть ли способ перебирать каждое поле, не зная имен.
Вы можете попробовать загрузить protobuf в объект вроде my_proto, а затем посмотреть результат keys(my_proto), dict(my_proto), list(my_proto)






Я использую этот пример сообщения здесь:
message MyMessage {
int32 foo = 1;
}
Вы можете получить список полей с помощью msg.DESCRIPTOR.fields:
>>> msg = myproto_pb2.MyMessage()
>>> msg.DESCRIPTOR.fields
<MessageFields sequence>
>>> msg.DESCRIPTOR.fields[0].name
'foo'
Но если ваш формат json соответствует формату .proto, библиотека Google protobuf уже предоставляет парсер json:
>>> google.protobuf.json_format.Parse('{"foo":5}', msg)
Ты не можешь. Protobufs - это двоичный протокол, который по своей задумке хранит очень мало информации о полях. В частности, он не хранит имена. Тем не менее, он хранит некоторую основную информацию о типах, поэтому вы, вероятно, можете получить данные некоторый (набор двоичных двоичных объектов и чисел с их номерами тегов).