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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With