Ho uno script Python che utilizza alcune funzioni Python a scatola chiusa (ovvero non posso modificare queste funzioni) fornite dal mio datore di lavoro. Quando chiamo queste funzioni, stanno stampando l'output sul mio terminale Linux che vorrei eliminare. Ho provato a reindirizzare stdout/stderr tramite;Elimina stampa stdout/stderr dalle funzioni Python
orig_out = sys.stdout
sys.stdout = StringIO()
rogue_function()
sys.stdout = orig_out
ma questo non riesce a rilevare l'output. Penso che le funzioni che sto chiamando via-Python (rogue_function() da sopra) siano realmente wrapper per C-code compilato, che in realtà stanno facendo la stampa.
Qualcuno sa di un modo in cui posso eseguire una "cattura profonda" di qualsiasi stampa consegnata a stdout/stderr da una funzione (e da eventuali sottofunzioni che funzionano chiamate)?
UPDATE:
ho finito per prendere il metodo descritto nella risposta selezionata in basso e la scrittura di un gestore di contesto per sopprimere stdout e 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)
Per utilizzare questo è sufficiente:
with suppress_stdout_stderr():
rogue_function()
Questo funziona "abbastanza bene". Sopprime la stampa dalle funzioni canaglia che ingombrano il mio script. Ho notato che durante il test è stato possibile superare le eccezioni sollevate e alcune stampe del logger, e non sono del tutto chiaro perché. Penso che abbia qualcosa a che fare con quando questi messaggi vengono inviati a stdout/stderr (penso che accada dopo che il mio gestore di contesto è uscito). Se qualcuno può confermare questo, sarei interessato a sentire i dettagli ...
fa [questo approccio] (http://stackoverflow.com/a/978264/344821) (dal barra laterale correlata) lavoro? – Dougal
Invece di impostare 'sys.stdout' su' StringIO() ', hai provato a impostarlo su un file? per esempio 'sys.stdout = open ('log.txt', 'w')' – carmenism
Dougal, grazie, sembra promettente, lo proverò domani. nullpointer, ho provato a indirizzarlo a una classe NullPointer() personalizzata, e anche questo non ha funzionato. – jeremiahbuddha