Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing bytes to standard output in a way compatible with both, python2 and python3

I want a function returning a file object with which I can write binary data to standard output. In python2 sys.stdout is such an object. In python3 it is sys.stdout.buffer.

What is the most elegant/preferred way to retrieve such an object so that it works for both, the python2 and the python3 interpreter?

Is the best way to check for existance of sys.stdout.buffer (probably using the inspect module) and if it exists, return it and if it doesnt, assume we are on python2 and return sys.stdout instead?

like image 583
josch Avatar asked Dec 25 '22 08:12

josch


1 Answers

No need to test, just use getattr():

# retrieve stdout as a binary file object
output = getattr(sys.stdout, 'buffer', sys.stdout)

This retrieves the .buffer attribute on sys.stdout, but if it doesn't exist (Python 2) it'll return the sys.stdout object itself instead.

Python 2:

>>> import sys
>>> getattr(sys.stdout, 'buffer', sys.stdout)
<open file '<stdout>', mode 'w' at 0x100254150>

Python 3:

>>> import sys
>>> getattr(sys.stdout, 'buffer', sys.stdout)
<_io.BufferedWriter name='<stdout>'>

Take into account that in Python 2, stdout is still opened in text mode, newlines are still translated to os.linesep when writing. The Python 3 BufferedWriter object won't do this for you.

like image 125
Martijn Pieters Avatar answered Dec 31 '22 14:12

Martijn Pieters