В contextlib.redirect_stdout () - функция print () вызывает AttributeError: у объекта 'str' нет атрибута 'write' - PullRequest
0 голосов
/ 15 января 2020

Я попытался перенаправить весь вывод консоли указанной c части моего python кода в текстовый файл, следуя совету этого сообщения .

Согласно этому сообщению , он должен работать с contextlib.redirect_stdout (), но , когда первая команда print () появляется в моей пользовательской функции custom_function_with_internal_print_calls (), он выбрасывает объект AttributeError: 'str' не имеет атрибута 'write' .

dummy_file = "dummy_textfile.txt"  # file to which the stdout shall be redirected

with contextlib.redirect_stdout(dummy_file):
    # Direct print()-function call
    print("Informative string which shall go to the textfile instead of the console.")

    # Indirect print()-function calls (internally)
    custom_function_with_internal_print_calls(**kwargs)

EDIT: В моем конкретном случае вместо функции print () в with-environment у меня есть пользовательская функция, которая имеет внутренние вызовы встроенной функции print () Python. Не должно иметь значения, появляется ли функция print () внутри другой функции или непосредственно на верхнем уровне, чтобы воспроизвести ошибку.

Параметры уже опробованы: Другие обходные пути не Похоже, это решение, которое я ищу, такое как

переопределение функции print () - или

написание декоратора для python 2.7 x (как я использую python 3.7x) или также

, перенаправляя функцию print () на файловый объект через print('Filename:', filename, file=f). Последнее означало бы в моем случае передать обработчик файла всем подфункциям в моей выбранной вложенной функции, что является слишком большой дополнительной модификацией кода для этого особого случая.

Я надеюсь, что смогу использовать просто среда with contextlib.redirect_stdout(dummy_file): обернута вокруг моей функции, чтобы перенаправить каждый вывод консоли этой самой функции в dummy_file .

Документация contextlib.redirect_stdout () мне тоже не помогает Заранее спасибо за предложения.

1 Ответ

0 голосов
/ 15 января 2020

Я нашел решение, передав обработчик файла"f" в функцию contextlib.redirect_stdout(f) вместо пути к файлу dummy_file , как было предложено в этом посте .

dummy_file = "dummy_textfile.txt"  # file to which the stdout shall be redirected

with open(dummy_file, 'w') as f:
    with contextlib.redirect_stdout(f):
        # Indirect print()-function calls (internally)
        custom_function_with_internal_print_calls(**kwargs)

При этом все вызовы функций print () записываются в dummy_file и впоследствии восстанавливают стандартный вывод консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...