IPython: redirecting output of a Python script to a file (like bash >)
Question: I have a Python script that I want to run in IPython. I want to redirect
(write) the output to a file, similar to:

    
    
    python my_script.py > my_output.txt
    

How do I do this when I run the script in IPython, i.e. like
`execfile('my_script.py')`

There is an [older page](http://rcjp.wordpress.com/2009/03/24/redirecting-
stdout-within-ipython/) describing a function that could be written to do
this, but I believe that there is now a built-in way to do this that I just
can't find.


Answer: IPython has its own context manager for [capturing
stdout/err](https://github.com/ipython/ipython/blob/rel-0.13.1/IPython/utils/io.py#L359),
but it doesn't redirect to files, it redirects to an object:

    
    
    from IPython.utils import io
    with io.capture_output() as captured:
        %run my_script.py
    
    print captured.stdout # prints stdout from your script
    

And this functionality is exposed in a `%%capture` cell-magic, as illustrated
in the [Cell Magics example
notebook](http://nbviewer.ipython.org/urls/raw.github.com/ipython/ipython/master/examples/notebooks/Cell%20Magics.ipynb).

It's a simple context manager, so you can write your own version that would
redirect to files:

    
    
    class redirect_output(object):
        """context manager for reditrecting stdout/err to files"""
    
    
        def __init__(self, stdout='', stderr=''):
            self.stdout = stdout
            self.stderr = stderr
    
        def __enter__(self):
            self.sys_stdout = sys.stdout
            self.sys_stderr = sys.stderr
    
            if self.stdout:
                sys.stdout = open(self.stdout, 'w')
            if self.stderr:
                if self.stderr == self.stdout:
                    sys.stderr = sys.stdout
                else:
                    sys.stderr = open(self.stderr, 'w')
    
        def __exit__(self, exc_type, exc_value, traceback):
            sys.stdout = self.sys_stdout
            sys.stderr = self.sys_stderr
    

which you would invoke with:

    
    
    with redirect_output("my_output.txt"):
        %run my_script.py
    

