Tengo un script de Python que está usando algunas funciones de Python de caja cerrada (es decir, no puedo editar estas funciones) proporcionadas por mi empleador. Cuando llamo a estas funciones, están imprimiendo salida a mi terminal de Linux que me gustaría suprimir. He intentado redirigir stdout/stderr a través de;Suprimir la impresión de stdout/stderr de las funciones de Python
orig_out = sys.stdout
sys.stdout = StringIO()
rogue_function()
sys.stdout = orig_out
pero esto no alcanza la salida. Creo que las funciones a las que llamo vía Python (rogue_function() desde arriba) son realmente envoltorios para código C compilado, que en realidad están haciendo la impresión.
¿Alguien sabe de una forma en que puedo hacer una "captura profunda" de cualquier impresión entregada a stdout/stderr por una función (y cualquier subfunción que funcione con llamadas)?
ACTUALIZACIÓN:
que terminó tomando el método descrito en la respuesta de su elección y escribir un gestor de contexto para suprimir stdout y stderr:
# Define a context manager to suppress stdout and stderr.
class suppress_stdout_stderr(object):
'''
A context manager for doing a "deep suppression" of stdout and stderr in
Python, i.e. will suppress all print, even if the print originates in a
compiled C/Fortran sub-function.
This will not suppress raised exceptions, since exceptions are printed
to stderr just before a script exits, and after the context manager has
exited (at least, I think that is why it lets exceptions through).
'''
def __init__(self):
# Open a pair of null files
self.null_fds = [os.open(os.devnull,os.O_RDWR) for x in range(2)]
# Save the actual stdout (1) and stderr (2) file descriptors.
self.save_fds = [os.dup(1), os.dup(2)]
def __enter__(self):
# Assign the null pointers to stdout and stderr.
os.dup2(self.null_fds[0],1)
os.dup2(self.null_fds[1],2)
def __exit__(self, *_):
# Re-assign the real stdout/stderr back to (1) and (2)
os.dup2(self.save_fds[0],1)
os.dup2(self.save_fds[1],2)
# Close all file descriptors
for fd in self.null_fds + self.save_fds:
os.close(fd)
Para utilizar este que acaba:
with suppress_stdout_stderr():
rogue_function()
Esto funciona "bastante bien". Suprime la impresión de las funciones deshonestas que atestaban mi script. Al probarlo, me di cuenta de que permite excepciones sobresalientes, así como algunas impresiones de registradores, y no estoy del todo claro por qué. Creo que tiene algo que ver con cuando se envían estos mensajes a stdout/stderr (creo que sucede después de que sale mi gestor de contexto). Si alguien puede confirmar esto, yo estaría interesado en escuchar los detalles ...
las hace [este enfoque] (http://stackoverflow.com/a/978264/344821) (de la barra lateral relacionada) ¿funciona? – Dougal
En lugar de establecer 'sys.stdout' en' StringIO() ', ¿ha intentado configurarlo en un archivo? es decir 'sys.stdout = open ('log.txt', 'w')' – carmenism
Dougal, gracias, parece prometedor, lo intentaré mañana. nullpointer, intenté dirigirlo a una clase NullPointer() personalizada, y eso tampoco funcionó. – jeremiahbuddha