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

Чтобы предотвратить выполнение функции в пакетной консоли в Python

Ну, заголовок мне кажется достаточным. Я использую некоторую функцию, которая в некоторых точках печатает что-то в консоли. Поскольку я не могу их модифицировать, я хотел бы знать, есть ли решение не печатать при использовании этих функций.

Спасибо большое!

Нико

4b9b3361

Ответ 1

Да, вы можете перенаправить sys.stdout:

import sys
import os

sys.stdout = open(os.devnull, "w")

my_nasty_function()

sys.stdout = sys.__stdout__

Просто замените my_nasty_function на вашу фактическую функцию.

EDIT: Теперь нужно работать и с окнами и вместо использовать sys.__stdout__.

Ответ 2

Ответ на вопрос о Константиниасе одобрен, однако нет необходимости фактически открывать нулевое устройство. И BTW, если вы хотите переносное нулевое устройство, есть os.devnull.

На самом деле все, что вам нужно, это класс, который будет игнорировать все, что вы ему пишете. Таким образом, более портативная версия будет:

class NullIO(StringIO):
    def write(self, txt):
       pass

sys.stdout = NullIO()

my_nasty_function()

sys.stdout = sys.__stdout__

.

Ответ 3

Решение Constantinius будет работать на * nix, но это должно работать на любой платформе:

import sys
import tempfile

sys.stdout = tempfile.TemporaryFile()

# Do crazy stuff here

sys.stdout.close()
#now the temp file is gone
sys.stdout = sys.__stdout__

Ответ 4

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

Это может быть сделано только проездом os.devnull как new_stdout аргумент к stdout_redirected() функции менеджера контекста, когда он используется.

Ответ 5

Другим открытием будет обертка вашей функции в декораторе.

import sys
from io import stringIO 

class NullIO(StringIO):
    def write(self, txt):
        pass


def silent(fn):
    """Decorator to silence functions."""
    def silent_fn(*args, **kwargs):
        saved_stdout = sys.stdout
        sys.stdout = NullIO()
        result = fn(*args, **kwargs)
        sys.stdout = saved_stdout
        return result
    return silent_fn


def nasty():
    """Uselful function with nasty prints."""
    print('a lot of annyoing output')
    return 42


# Wrap in decorator to prevent printing.
silent_nasty = silent(nasty)
# Same output, but prints only once.
nasty(), silent_nasty()