Ich habe ein Python-Skript, das einige geschlossene Python-Funktionen (d. H. Ich kann diese Funktionen nicht bearbeiten) von meinem Arbeitgeber zur Verfügung gestellt. Wenn ich diese Funktionen aufrufen, drucken sie die Ausgabe an mein Linux-Terminal, die ich gerne unterdrücken möchte. Ich habe versucht, stdout/stderr umzuleiten;Unterdrücken stdout/stderr Drucken von Python-Funktionen
orig_out = sys.stdout
sys.stdout = StringIO()
rogue_function()
sys.stdout = orig_out
aber dies schlägt die Ausgabe nicht. Ich denke, die Funktionen, die ich via-Python (rogue_function() von oben) anrufe, sind wirklich Wrapper für kompilierten C-Code, die eigentlich das Drucken machen.
Kennt jemand eine Art, wie ich eine "Deep-Capture" von jedem Druck an stdout/stderr von einer Funktion (und alle Unterfunktionen, die Anrufe Funktion) machen kann tun?
UPDATE:
Ich beendete das Verfahren in der ausgewählten Antwort skizzierte Aufnahme unten und das Schreiben eines Kontext-Manager stdout und stderr zu unterdrücken:
# 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)
dies nur Sie verwenden:
with suppress_stdout_stderr():
rogue_function()
Das funktioniert "ziemlich gut". Es unterdrückt den Ausdruck von den Rogue-Funktionen, die mein Skript überladen haben. Ich habe es beim Testen festgestellt, dass es sowohl erhöhte Ausnahmen als auch einen Logger-Druck durchlässt, und mir ist nicht ganz klar, warum. Ich denke, es hat etwas mit zu tun, wenn diese Nachrichten an stdout/stderr gesendet werden (ich denke, es passiert, nachdem mein Kontextmanager beendet). Wenn jemand dies bestätigen können, ich Interesse hätte, um die Details zu hören ...
Does [dieser Ansatz] (http://stackoverflow.com/a/978264/344821) (von der verwandte Seitenleiste) arbeiten? – Dougal
Anstatt 'sys.stdout' auf' StringIO() 'zu setzen, haben Sie versucht, es in eine Datei zu setzen? d. h. 'sys.stdout = offen ('log.txt', 'w')' – carmenism
Dougal, danke, das sieht vielversprechend aus, ich werde es morgen ausprobieren. Nullpointer, ich habe versucht, es an eine benutzerdefinierte NullPointer() -Klasse zu richten, und das hat auch nicht funktioniert. – jeremiahbuddha