IPython: redirecting output of a Python script to a file (like bash >)

后端 未结 7 2093
慢半拍i
慢半拍i 2020-12-01 03:50

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
         


        
7条回答
  •  鱼传尺愫
    2020-12-01 04:17

    IPython has its own context manager for capturing stdout/err, 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.

    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
    

提交回复
热议问题