Are there situations in which sys.stdout.write()
is preferable to print
?
(Examples: better performance; code that makes more sense)
print
is just a thin wrapper that formats the inputs (modifiable, but by default with a space between args and newline at the end) and calls the write function of a given object. By default this object is sys.stdout
, but you can pass a file using the "chevron" form. For example:
print >> open('file.txt', 'w'), 'Hello', 'World', 2+3
See: https://docs.python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement
In Python 3.x, print
becomes a function, but it is still possible to pass something other than sys.stdout
thanks to the file
argument.
print('Hello', 'World', 2+3, file=open('file.txt', 'w'))
See https://docs.python.org/3/library/functions.html#print
In Python 2.6+, print
is still a statement, but it can be used as a function with
from __future__ import print_function
Update: Bakuriu commented to point out that there is a small difference between the print function and the print statement (and more generally between a function and a statement).
In case of an error when evaluating arguments:
print "something", 1/0, "other" #prints only something because 1/0 raise an Exception
print("something", 1/0, "other") #doesn't print anything. The function is not called
print
first converts the object to a string (if it is not already a string). It will also put a space before the object if it is not the start of a line and a newline character at the end.
When using stdout
, you need to convert the object to a string yourself (by calling "str", for example) and there is no newline character.
So
print 99
is equivalent to:
import sys
sys.stdout.write(str(99) + '\n')
Here's some sample code based on the book Learning Python by Mark Lutz that addresses your question:
import sys
temp = sys.stdout # store original stdout object for later
sys.stdout = open('log.txt', 'w') # redirect all prints to this log file
print("testing123") # nothing appears at interactive prompt
print("another line") # again nothing appears. it's written to log file instead
sys.stdout.close() # ordinary file object
sys.stdout = temp # restore print commands to interactive prompt
print("back to normal") # this shows up in the interactive prompt
Opening log.txt in a text editor will reveal the following:
testing123
another line
My question is whether or not there are situations in which
sys.stdout.write()
is preferable to
After finishing developing a script the other day, I uploaded it to a unix server. All my debug messages used print
statements, and these do not appear on a server log.
This is a case where you may need sys.stdout.write
instead.
There's at least one situation in which you want sys.stdout
instead of print.
When you want to overwrite a line without going to the next line, for instance while drawing a progress bar or a status message, you need to loop over something like
Note carriage return-> "\rMy Status Message: %s" % progress
And since print adds a newline, you are better off using sys.stdout
.
My question is whether or not there are situations in which
sys.stdout.write()
is preferable to
If you're writing a command line application that can write to both files and stdout then it is handy. You can do things like:
def myfunc(outfile=None):
if outfile is None:
out = sys.stdout
else:
out = open(outfile, 'w')
try:
# do some stuff
out.write(mytext + '\n')
# ...
finally:
if outfile is not None:
out.close()
It does mean you can't use the with open(outfile, 'w') as out:
pattern, but sometimes it is worth it.
In 2.x, the print
statement preprocesses what you give it, turning it into strings along the way, handling separators and newlines, and allowing redirection to a file. 3.x turns it into a function, but it still has the same responsibilities.
sys.stdout
is a file or file-like that has methods for writing to it which take strings or something along that line.
A difference between print
and sys.stdout.write
to point out in Python 3, is also the value which is returned when executed in the terminal. In Python 3, sys.stdout.write
returns the length of the string whereas print
returns just None
.
So for example running following code interactively in the terminal would print out the string followed by its length, since the length is returned and output when run interactively:
>>> sys.stdout.write(" hi ")
hi 4
It is preferable when dynamic printing is useful, for instance, to give information in a long process:
import time, sys
Iterations = 555
for k in range(Iterations+1):
# Some code to execute here ...
percentage = k / Iterations
time_msg = "\rRunning Progress at {0:.2%} ".format(percentage)
sys.stdout.write(time_msg)
sys.stdout.flush()
time.sleep(0.01)
>>> sys.stdout.write(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: expected a string or other character buffer object
>>> sys.stdout.write("a")
a>>> sys.stdout.write("a") ; print(1)
a1
Observing the example above:
sys.stdout.write
won't write non-string object, but print
will
sys.stdout.write
won't add a new line symbol in the end, but print
will
If we dive deeply,
sys.stdout
is a file object which can be used for the output of print()
if file argument of print()
is not specified, sys.stdout
will be used
In Python 3 there is valid reason to use print over sys.stdout.write
, but this reason can also be turned into a reason to use sys.stdout.write
instead.
This reason is that, now print is a function in Python 3, you can override this. So you can use print everywhere in a simple script and decide those print statements need to write to stderr
instead. You can now just redefine the print function, you could even change the print function global by changing it using the builtins module. Off course with file.write
you can specify what file is, but with overwriting print you can also redefine the line separator, or argument separator.
The other way around is. Maybe you are absolutely certain you write to stdout
, but also know you are going to change print to something else, you can decide to use sys.stdout.write
, and use print for error log or something else.
So, what you use depends on how you intend to use it. print
is more flexible, but that can be a reason to use and to not use it. I would still opt for flexibility instead, and choose print. Another reason to use print
instead is familiarity. More people will now what you mean by print and less know sys.stdout.write
.
In Python 2, if you need to pass around a function, then you can assign os.sys.stdout.write
to a variable. You cannot do this (in the REPL) with print
.
>import os
>>> cmd=os.sys.stdout.write
>>> cmd('hello')
hello>>>
That works as expected.
>>> cmd=print
File "<stdin>", line 1
cmd=print
^
SyntaxError: invalid syntax
That does not work. print
is a magical function.
Are there situations in which sys.stdout.write() is preferable to print?
For example I'm working on small function which prints stars in pyramid format upon passing the number as argument, although you can accomplish this using end="" to print in a separate line, I used sys.stdout.write in co-ordination with print to make this work. To elaborate on this stdout.write prints in the same line where as print always prints its contents in a separate line.
import sys
def printstars(count):
if count >= 1:
i = 1
while (i <= count):
x=0
while(x<i):
sys.stdout.write('*')
x = x+1
print('')
i=i+1
printstars(5)
Are there situations in which sys.stdout.write() is preferable to print?
I have found that stdout works better than print in a multithreading situation. I use a queue (FIFO) to store the lines to print and I hold all threads before the print line until my print queue is empty. Even so, using print I sometimes lose the final \n on the debug I/O (using the Wing Pro IDE).
When I use std.out with \n in the string, the debug I/O formats correctly and the \n's are accurately displayed.
sys.stdout.write()
andprint
(and/or why Python has both) is a perfectly reasonable question and does not need examples. OP did not say the command syntax was confusing. – smci