У меня большой проект, состоящий из достаточно большого количества модулей, каждый выводит что-то на стандартный вывод. Сейчас, когда проект разросся, крупных нет. из print
заявлений печати много на станд отказа , который сделал программу значительно медленнее.
Итак, теперь я хочу решить во время выполнения , печатать ли что-либо в stdout. Я не могу вносить изменения в модули, так как их много. (Я знаю, что могу перенаправить stdout в файл, но даже это значительно медленнее.)
Итак, мой вопрос: как мне перенаправить stdout ни на что, т.е. как заставить print
оператор ничего не делать?
# I want to do something like this.
sys.stdout = None # this obviously will give an error as Nonetype object does not have any write method.
В настоящее время единственная идея, которая у меня есть, - это создать класс, который имеет метод записи (который ничего не делает) и перенаправить стандартный вывод на экземпляр этого класса.
class DontPrint(object):
def write(*args): pass
dp = DontPrint()
sys.stdout = dp
Есть ли в python для этого встроенный механизм? Или есть что-то лучше этого?
источник
Ответы:
Кросс-платформенный:
В Windows:
В Linux:
источник
sys.stdout
и верните ее после. Например,old_stdout = sys.stdout
перед любым другим кодом, затем,sys.stdout = old_stdout
когда вы закончите.os.write(1, b'abc\n')
. Вам нужноos.dup2()
перенаправить на уровне файлового дескриптора, см.stdout_redirected()
sys.__stdout__
для отмены перенаправления. Так что вы просто делаетеsys.stdout = sys.__stdout__
и не нужно хранить резервную копию.Хороший способ сделать это - создать небольшой процессор контекста, в который вы оборачиваете свои отпечатки. Затем вы просто используете
with
выражение is для отключения всего вывода.Python 2:
Python 3.4+:
Python 3.4 имеет встроенный процессор контекста, поэтому вы можете просто использовать contextlib следующим образом:
Запуск этого кода выводит только вторую строку вывода, а не первую:
Это работает кросс-платформенный (Windows + Linux + Mac OSX) и чище, чем другие ответы imho.
источник
Если вы используете python 3.4 или выше, есть простое и безопасное решение с использованием стандартной библиотеки:
источник
with contextlib.redirect_stdout(None)
тоже работаетAttributeError: 'NoneType' object has no attribute 'write'
write
методом, который ничего не делает. Смотрите мой ответ ниже.(по крайней мере, в моей системе) кажется, что запись в os.devnull примерно в 5 раз быстрее, чем запись в класс DontPrint, т.е.
дал следующий результат:
источник
Если вы работаете в среде Unix (включая Linux), вы можете перенаправить вывод на
/dev/null
:И для Windows:
источник
nul = myfunc()
?Ваш класс будет работать нормально (за исключением имени
write()
метода - его нужно вызывать вwrite()
нижнем регистре). Просто убедитесь, что вы сохранили копиюsys.stdout
в другой переменной.Если вы используете * NIX, вы можете это сделать
sys.stdout = open('/dev/null')
, но это менее переносимо, чем создание собственного класса.источник
Как насчет этого:
При этом используются функции модуля contextlib, чтобы скрыть вывод любой команды, которую вы пытаетесь запустить, в зависимости от результата
should_hide_output()
, а затем восстанавливает поведение вывода после того, как эта функция будет завершена.Если вы хотите скрыть стандартный вывод ошибок, импортируйте
redirect_stderr
изcontextlib
и добавьте строку, говорящуюstack.enter_context(redirect_stderr(null_stream))
.Основным недостатком является то, что это работает только в Python 3.4 и более поздних версиях.
источник
redirect_stdout()
аналог в более ранних версиях Python (например, используяcontextlib.contextmanager
) .Вы можете просто издеваться над этим.
источник
Почему бы тебе не попробовать это?
источник
Это нормально для
print()
случая. Но это может вызвать ошибку, если вы вызовете какой-либо метод sys.stdout, напримерsys.stdout.write()
.В документах есть примечание :
источник
sys.stdout = Null
поэтому в некоторых случаях это может быть опасно.Дополнение к ответу iFreilicht - он работает как для python 2, так и для 3.
источник