blob: 04a6966eb90014ddfa5b0c951e61e1f547a173a3 [file] [log] [blame]
"""
Class to copy stderr to stdout.
This is intended for use in cronjobs,
where it is useful to have both stderr and stdout in the log file
but still have stderr so that the mailer gets any errors
The main script should be run unbuffered (-u)
Unfortunately Python does not seem to offer the equivalent of:
perl -[mM][-]module execute "use/no module..." before executing program
ruby -rlibrary require the library before executing your script
lua -l name require library 'name'
Thus the module has to be explicitly imported by the user script,
and the user must defing the 'ERRTEE' environment variable to enable it
"""
import sys
import os
class ErrTee(object):
def write(self, buf):
sys.__stderr__.write(buf)
sys.stdout.write(buf)
def flush(self):
sys.__stderr__.flush()
# only enable the override if it is needed
if 'ERRTEE' in os.environ:
sys.stderr=ErrTee()
if __name__ == '__main__': # simple test
print("STDOUT1")
sys.stderr.write("STDERR2\n")
sys.stderr=ErrTee() # enable for testing
sys.stderr.write("STDERR3 (should also appear on STDOUT)\n")
raise Exception("STDERR4 (should also appear on STDOUT)")