Откройте /dev/null для записи, используйте os.dup() для копирования stdout и используйте os.dup2() для копирования вашего открытого /dev/null в stdout. Используйте os.dup2(), чтобы скопировать скопированный стандартный вывод обратно в реальный стандартный вывод после.
разобрался, требуются sys.stdout.fileno () и devnull.fileno (), и после этого он работает, спасибо !!
- personRok; 14.11.2010
comment
Разве вы не должны закрыть devnull в конце с помощью devnull.close() или открыть его с помощью оператора with?
- personMrUser; 09.03.2016
comment
Рид, твой ответ мне все еще не подходит. Мне нужен os.fsync(devnull.fileno()) перед финальным dup2. Для отладки попробуйте import pybullet as pb как то, что вы хотите заглушить :)
- personandrea; 30.10.2020
Дэйв Смит прекрасно ответил на этот вопрос в своем блог. По сути, он красиво завершает ответ Игнасио:
def suppress_stdout():
with open(os.devnull, "w") as devnull:
old_stdout = sys.stdout
sys.stdout = devnull
try:
yield
finally:
sys.stdout = old_stdout
Теперь вы можете окружить любую функцию, которая искажает нежелательный шум, в стандартный вывод следующим образом:
print "You can see this"
with suppress_stdout():
print "You cannot see this"
print "And you can see this again"
Для Python 3 вы можете использовать:
from contextlib import contextmanager
import os
import sys
@contextmanager
def suppress_stdout():
with open(os.devnull, "w") as devnull:
old_stdout = sys.stdout
sys.stdout = devnull
try:
yield
finally:
sys.stdout = old_stdout
personManu CJschedule11.01.2018
comment
Эти решения могут только подавлять вывод, произведенный в python.
- personVic; 23.05.2019
comment
Наверное, да. Кроме того, я обнаружил, что это решение не может подавить некоторые выходные данные python, например, индикатор выполнения TQDM удается распечатать в Stdout, даже когда в этом контексте, не знаю почему. Тем не менее, я обнаружил, что в большинстве случаев в Python это работает.
- personManu CJ; 23.05.2019
comment
Индикатор выполнения TQDM по умолчанию выводится в stderr, чтобы подавить его, вам также потребуется перенаправить sys.stderr - personMajo; 11.12.2020
У меня была такая же проблема, и я исправил ее вот так:
from cStringIO import StringIO
def wrapped_svm_predict(*args):
"""Run :func:`svm_predict` with no *stdout* output."""
so, sys.stdout = sys.stdout, StringIO()
ret = svm_predict(*args)
sys.stdout = so
return ret
personOben Sonneschedule23.02.2011
comment
Это будет работать, если svm_predict - это вывод, полученный из python, но не из общей библиотеки, которую вызывает python, что, как я считаю, является тем, о чем спрашивал OP.
- personAlex Flint; 17.10.2012
comment
Для меня это работало с использованием привязок Python к libsvm. Думаю, для PyML ситуация аналогичная. Stdout - это свойство процесса, т.е. моя упаковка (а также решение Ignacio) отлично работает до тех пор, пока внешние функции не используются через подпроцессы. Он потерпит неудачу только в том случае, если кто-то откроет /dev/stdout для записи вывода.
- personOben Sonne; 18.10.2012
comment
Это именно то, что делает большинство разделяемых библиотек, поэтому это решение не будет работать для большинства людей. Вышеупомянутое решение будет ближе к тому, что нужно запрашивающему.
- personkamelkev; 01.07.2013
У меня была аналогичная проблема с инициализацией portaudio / PyAudio. Я начал с ответа Рейда, который сработал. Хотя вместо этого мне нужно было перенаправить stderr. Итак, вот обновленная кроссплатформенная версия, которая перенаправляет оба:
import sys, os
# hide diagnostic output
with open(os.devnull, 'w') as devnull:
# suppress stdout
orig_stdout_fno = os.dup(sys.stdout.fileno())
os.dup2(devnull.fileno(), 1)
# suppress stderr
orig_stderr_fno = os.dup(sys.stderr.fileno())
os.dup2(devnull.fileno(), 2)
print('*** stdout should be hidden! ****')
print('*** stderr should be too! ****',
file=sys.stderr)
os.dup2(orig_stdout_fno, 1) # restore stdout
os.dup2(orig_stderr_fno, 2) # restore stderr
print('done.')
Должно быть легко закомментировать ненужную часть.
os.devnull
. - person jfs   schedule 07.05.2014