I couldn't find anywhere a possibility to print a human friendly content of a Google Protobuf message.

Is there an equivalent in Python for Java's toString() or C++'s DebugString()?


If you're using the protobuf package, the print function/statement will give you a human-readable representation of the message, because of the __str__ method :-).

  • Indeed, this works. However, for my particular message description, for some specific message contents, the messages are printed as empty strings, but I think this is a bug from library. – Alexandru Irimiea Nov 7 '15 at 0:05

Here's an example for read/write human friendly text file using protobuf 2.0 in python.

from google.protobuf import text_format

read from a text file

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

write to a text file

f = open('b.txt', 'w')

The c++ equivalent is:

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


    delete input;
    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;
    return success;
  • Is there a ruby equivalent? – Nick Aug 14 '19 at 8:02

As answered, print and __str__ do work, but I wouldn't use them for anything more than debug strings.

If you're writing to something that users could see, it's better to use the google.protobuf.text_format module, which has some more controls (e.g. escaping UTF8 strings or not), as well as functions for parsing text-format as protobufs.

Your Answer

