I wrote a previous post about how to redirect standard output from a Python script to a GUI window. In this post, I will give an even simpler example of to redirect standard output to a log file. During the early development and debugging of Python programs, I use print statements to keep me informed of what’s happening. However, printing to the terminal is not always practical–for example, when I run numerical code on a parallel cluster, there is no way to determine which output came from which instance of the program. Here is a class that you can use to redirect standard output to a log file:
class Logger: """The Logger class can be used to redirect standard output to a log file. Usage: Create a Logger object and redirect standard output to the Logger object. For example: output = Logger(file_handle, True) import sys sys.stdout = output """ def __init__(self, logFile, echo): """Arguments: logFile a file object that is available for writing echo Boolean. If True, output is sent to standard output in addition to the log file. """ import sys self.out = sys.stdout self.logFile = logFile self.echo = echo def write(self, s): """Required method that replaces stdout. You don't have to call this directly--all print statements will be redirected here.""" self.logFile.write(s) if self.echo: self.out.write(s)
I create a Logger object and pass it as an optional keyword parameter to an object that produces output that I want to redirect. The __init__ method of that object looks something like this:
def __init__(... , output=None): if output is not None: print "Redirecting output..." import sys sys.stdout = output
You should be able to make use of this class “as is.” It would be a little more robust if it checked whether the file object was available for writing–feel free to improve upon it.