Чтобы предотвратить выполнение функции в пакетной консоли в Python
Ну, заголовок мне кажется достаточным.
Я использую некоторую функцию, которая в некоторых точках печатает что-то в консоли.
Поскольку я не могу их модифицировать, я хотел бы знать, есть ли решение не печатать при использовании этих функций.
Спасибо большое!
Нико
Ответы
Ответ 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()