2

With Python3 I have re-opened stdout in binary mode. After that when I print("Hello") it tells me that I need to use a bytes-like object. Fair enough, it's in binary mode now.

However when I do this:

print(b"Some bytes")

I still get this error:

TypeError: a bytes-like object is required, not 'str'

What's up with that?

Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
Timmmm
  • 88,195
  • 71
  • 364
  • 509

1 Answers1

5

print() always writes str values. It'll convert any arguments to strings first, including bytes objects.

From the print() documentation:

All non-keyword arguments are converted to strings like str() does and written to the stream, separated by sep and followed by end.

You can't use print() on a binary stream, period. Either write directly to the stream (using it's .write() method), or wrap the stream in a TextIOWrapper() object to handle encoding.

These both work:

import sys

sys.stdout.write(b'Some bytes\n')  # note, manual newline added

and

from io import TextIOWrapper
import sys

print('Some text', file=TextIOWrapper(sys.stdout, encoding='utf8'))
Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343