Подтвердить что ты не робот

IPython: перенаправление вывода Python script в файл (например, bash>)

У меня есть Python script, который я хочу запустить в IPython. Я хочу перенаправить (написать) вывод в файл, похожий на:

python my_script.py > my_output.txt

Как это сделать, когда я запускаю script в IPython, т.е. как execfile('my_script.py')

Существует более старая страница, описывающая функцию, которая может быть написана для этого, но я считаю, что теперь есть встроенный способ для этого я просто не могу найти.

4b9b3361

Ответ 1

IPython имеет свой собственный менеджер контекстов для захват stdout/err, но он не перенаправляет файлы, перенаправляет его на объект:

from IPython.utils import io
with io.capture_output() as captured:
    %run my_script.py

print captured.stdout # prints stdout from your script

И эта функциональность раскрывается в %%capture cell-magic, как показано в примере Cell Magics.

Это простой менеджер контекста, поэтому вы можете написать свою собственную версию, которая будет перенаправляться на файлы:

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

с которым вы будете ссылаться:

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

Ответ 2

Написание script показалось мне излишним, поскольку я просто хотел, чтобы что-то простое рассмотрело много текста, содержащегося в переменной, работая в IPython. Это то, что сработало для меня:

%store VARIABLE >> file.txt (добавляет)
%store VARIABLE > file.txt (перезаписывается)

Ответ 3

Там хакерский способ перезаписи sys.stdout и sys.stderr с файлом, но это действительно не очень хороший способ. Действительно, если вы хотите контролировать, откуда идет вывод изнутри python, вам нужно реализовать какую-то систему обработки журналов и/или вывода, которую вы можете настроить с помощью командной строки или аргументов функции вместо использования print.