Eu tenho um grande projeto que consiste em um número suficientemente grande de módulos, cada um imprimindo algo na saída padrão. Agora, como o projeto cresceu em tamanho, não há grandes. de print
instruções imprimindo muito no padrão, o que tornou o programa consideravelmente mais lento.
Então, agora eu quero decidir em tempo de execução se deve ou não imprimir algo no stdout. Não posso fazer alterações nos módulos, pois há muitos deles. (Eu sei que posso redirecionar o stdout para um arquivo, mas mesmo isso é consideravelmente lento.)
Portanto, minha pergunta é: como redireciono o stdout para nada, ou seja, como faço para que a print
instrução não faça nada?
# 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.
Atualmente, a única idéia que tenho é criar uma classe que tenha um método de gravação (que não faça nada) e redirecionar o stdout para uma instância dessa classe.
class DontPrint(object):
def write(*args): pass
dp = DontPrint()
sys.stdout = dp
Existe um mecanismo embutido em python para isso? Ou há algo melhor que isso?
fonte
Respostas:
Plataforma cruzada:
No Windows:
No Linux:
fonte
sys.stdout
e coloque-a novamente depois. Por exemplo,old_stdout = sys.stdout
antes de qualquer outro código,sys.stdout = old_stdout
quando terminar.os.write(1, b'abc\n')
,. Você precisaos.dup2()
redirecionar no nível do descritor de arquivo, consultestdout_redirected()
sys.__stdout__
para cancelar um redirecionamento. Então você fazsys.stdout = sys.__stdout__
e não precisa armazenar o backup.Uma boa maneira de fazer isso é criar um pequeno processador de contexto no qual você imprime suas impressões. Em seguida, basta usar está em uma
with
declaração para silenciar toda a saída.Python 2:
Python 3.4 ou superior:
O Python 3.4 possui um processador de contexto como este embutido, então você pode simplesmente usar o contextlib como este:
A execução desse código imprime apenas a segunda linha de saída, não a primeira:
Isso funciona em várias plataformas (Windows + Linux + Mac OSX) e é mais limpo do que as outras respostas.
fonte
Se você estiver no python 3.4 ou superior, há uma solução simples e segura usando a biblioteca padrão:
fonte
with contextlib.redirect_stdout(None)
funciona bemAttributeError: 'NoneType' object has no attribute 'write'
write
método fictício que não faz nada. Veja minha resposta abaixo.(pelo menos no meu sistema) parece que escrever para os.devnull é cerca de 5x mais rápido do que escrever para uma classe DontPrint, ou seja,
deu a seguinte saída:
fonte
Se você estiver em um ambiente Unix (Linux incluído), poderá redirecionar a saída para
/dev/null
:E para Windows:
fonte
nul = myfunc()
?Que tal agora:
Isso usa os recursos do módulo contextlib para ocultar a saída de qualquer comando que você esteja tentando executar, dependendo do resultado
should_hide_output()
e, em seguida, restaura o comportamento da saída após a execução da função.Se você deseja ocultar saída de erro padrão, em seguida, importar
redirect_stderr
a partircontextlib
e adicione uma linha dizendostack.enter_context(redirect_stderr(null_stream))
.A principal desvantagem é que isso só funciona no Python 3.4 e versões posteriores.
fonte
redirect_stdout()
o analógico em versões anteriores do Python (por exemplo, usandocontextlib.contextmanager
) .Sua classe funcionará bem (com exceção do
write()
nome do método - ele precisa ser chamado emwrite()
minúsculas). Apenas certifique-se de salvar uma cópiasys.stdout
em outra variável.Se você estiver no * NIX, poderá fazê-lo
sys.stdout = open('/dev/null')
, mas isso é menos portátil do que rolar sua própria classe.fonte
Você pode simplesmente zombar.
fonte
Por que você não tenta isso?
fonte
Tudo bem para o
print()
caso. Mas isso pode causar um erro se você chamar qualquer método de sys.stdout, por exemplosys.stdout.write()
.Há uma observação nos documentos :
fonte
sys.stdout = Null
isso, em alguns casos, pode ser perigoso.Complemento à resposta da iFreilicht - funciona tanto para o python 2 quanto para o 3.
fonte