web-dev-qa-db-fra.com

Imprimer un message Protobuf convivial

Je n'ai trouvé nulle part la possibilité d'imprimer le contenu convivial d'un message Google Protobuf.

Existe-t-il un équivalent dans Python pour la toString() de Java ou la DebugString() de C++?

18

Si vous utilisez le package protobuf , la fonction/instruction print vous donnera une représentation lisible par l'homme du message, en raison du __str__ méthode :-).

9
cdonts

Voici un exemple de lecture/écriture convivial fichier texte utilisant protobuf 2.0 in python.

from google.protobuf import text_format

lire à partir d'un fichier texte

f = open('a.txt', 'r')
address_book = addressbook_pb2.AddressBook() # replace with your own message
text_format.Parse(f.read(), address_book)
f.close()

écrire dans un fichier texte

f = open('b.txt', 'w')
f.write(text_format.MessageToString(address_book))
f.close()

L'équivalent c ++ est:

bool ReadProtoFromTextFile(const std::string filename, google::protobuf::Message* proto)
{
    int fd = _open(filename.c_str(), O_RDONLY);
    if (fd == -1)
        return false;

    google::protobuf::io::FileInputStream* input = new google::protobuf::io::FileInputStream(fd);
    bool success = google::protobuf::TextFormat::Parse(input, proto);

    delete input;
    _close(fd);
    return success;
}

bool WriteProtoToTextFile(const google::protobuf::Message& proto, const std::string filename)
{
    int fd = _open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1)
        return false;

    google::protobuf::io::FileOutputStream* output = new google::protobuf::io::FileOutputStream(fd);
    bool success = google::protobuf::TextFormat::Print(proto, output);

    delete output;
    _close(fd);
    return success;
}
28
Neil Z. Shao

Comme répondu, print et __str__ fonctionne, mais je ne les utiliserais pas pour autre chose que des chaînes de débogage.

Si vous écrivez quelque chose que les utilisateurs peuvent voir, il vaut mieux utiliser le google.protobuf.text_format module, qui a plus de contrôles (par exemple, échapper ou non les chaînes UTF8), ainsi que des fonctions pour analyser le format texte en tant que protobufs.

3
Rafael Lerm