Tengo un gran proyecto que consta de un número suficientemente grande de módulos, cada uno imprimiendo algo en la salida estándar. Ahora que el proyecto ha crecido en tamaño, hay grandes no. de print
declaraciones que imprimen mucho en la salida estándar lo que ha hecho que el programa sea considerablemente más lento.
Entonces, ahora quiero decidir en tiempo de ejecución si imprimir o no algo en el stdout. No puedo hacer cambios en los módulos, ya que hay muchos. (Sé que puedo redirigir el stdout a un archivo, pero incluso esto es considerablemente lento).
Entonces, mi pregunta es ¿cómo redirijo el stdout a nada, es decir, cómo hago que la print
declaración no haga 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.
Actualmente, la única idea que tengo es crear una clase que tenga un método de escritura (que no hace nada) y redirigir el stdout a una instancia de esta clase.
class DontPrint(object):
def write(*args): pass
dp = DontPrint()
sys.stdout = dp
¿Hay un mecanismo incorporado en Python para esto? ¿O hay algo mejor que esto?
fuente
Respuestas:
Multiplataforma:
En Windows:
En Linux:
fuente
sys.stdout
y vuelva a configurarlo después. Por ejemplo,old_stdout = sys.stdout
antes de cualquiera de los otros códigos, luegosys.stdout = old_stdout
cuando haya terminado.os.write(1, b'abc\n')
. Necesitaos.dup2()
, para redirigir en el nivel de descriptor de archivo, veastdout_redirected()
sys.__stdout__
para cancelar una redirección. Así que solo debes hacerlosys.stdout = sys.__stdout__
y no es necesario almacenar la copia de seguridad.Una buena manera de hacer esto es crear un pequeño procesador de contexto en el que se envuelvan sus impresiones. Luego, simplemente use una
with
declaración para silenciar todos los resultados.Python 2:
Python 3.4+:
Python 3.4 tiene un procesador de contexto como este incorporado, por lo que simplemente puede usar contextlib de esta manera:
La ejecución de este código solo imprime la segunda línea de salida, no la primera:
Esto funciona multiplataforma (Windows + Linux + Mac OSX), y es más limpio que las otras respuestas en mi humilde opinión.
fuente
Si está en Python 3.4 o superior, hay una solución simple y segura que utiliza la biblioteca estándar:
fuente
with contextlib.redirect_stdout(None)
funciona bienAttributeError: 'NoneType' object has no attribute 'write'
write
método ficticio que no hace nada. Vea mi respuesta a continuación.(al menos en mi sistema) parece que escribir en os.devnull es aproximadamente 5 veces más rápido que escribir en una clase DontPrint, es decir
dio el siguiente resultado:
fuente
Si está en un entorno Unix (Linux incluido), puede redirigir la salida a
/dev/null
:Y para Windows:
fuente
nul = myfunc()
?Qué tal esto:
Esto usa las características en el módulo contextlib para ocultar la salida de cualquier comando que esté intentando ejecutar, dependiendo del resultado de
should_hide_output()
, y luego restaura el comportamiento de salida después de que esa función se haya ejecutado.Si desea ocultar la salida de error estándar, a continuación, importar
redirect_stderr
desdecontextlib
y añadir una línea que digastack.enter_context(redirect_stderr(null_stream))
.El principal inconveniente es que esto solo funciona en Python 3.4 y versiones posteriores.
fuente
redirect_stdout()
el análogo de versiones anteriores de Python (por ejemplo, usandocontextlib.contextmanager
) .Su clase funcionará bien (con la excepción del
write()
nombre del método; debe llamarse enwrite()
minúsculas). Solo asegúrese de guardar una copia desys.stdout
en otra variable.Si está en un * NIX, puede hacerlo
sys.stdout = open('/dev/null')
, pero esto es menos portátil que rodar su propia clase.fuente
Puedes burlarte de eso.
fuente
¿Por qué no intentas esto?
fuente
Está bien para el
print()
caso. Pero puede causar un error si llama a cualquier método de sys.stdout, por ejemplosys.stdout.write()
.Hay una nota en los documentos :
fuente
sys.stdout = Null
lo que en algunos casos puede ser peligroso.Complemento a la respuesta de iFreilicht : funciona tanto para python 2 como para 3.
fuente