Ich habe ein großes Projekt, das aus einer ausreichend großen Anzahl von Modulen besteht, von denen jedes etwas auf die Standardausgabe druckt. Jetzt, da das Projekt größer geworden ist, gibt es große Nr. von print
Aussagen, die viel auf den Standard drucken, was das Programm erheblich langsamer gemacht hat.
Daher möchte ich jetzt zur Laufzeit entscheiden, ob etwas auf dem Standard gedruckt werden soll oder nicht. Ich kann keine Änderungen an den Modulen vornehmen, da es viele davon gibt. (Ich weiß, dass ich den Standard in eine Datei umleiten kann, aber selbst das ist sehr langsam.)
Meine Frage ist also, wie ich den Standard zu nichts umleiten kann, dh wie kann ich die print
Anweisung dazu bringen, nichts zu tun?
# 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.
Derzeit ist die einzige Idee, die ich habe, eine Klasse zu erstellen, die eine Schreibmethode hat (die nichts tut) und die Standardausgabe auf eine Instanz dieser Klasse umzuleiten.
class DontPrint(object):
def write(*args): pass
dp = DontPrint()
sys.stdout = dp
Gibt es dafür einen eingebauten Mechanismus in Python? Oder gibt es etwas Besseres?
quelle
Antworten:
Plattformübergreifend:
Unter Windows:
Unter Linux:
quelle
sys.stdout
und setzen Sie ihn danach zurück. Zum Beispielold_stdout = sys.stdout
vor einem der anderen Codes,sys.stdout = old_stdout
wenn Sie fertig sind.os.write(1, b'abc\n')
. Sie müssenos.dup2()
, um auf der Ebene des Dateideskriptors umzuleiten, siehestdout_redirected()
sys.__stdout__
eine Umleitung abgebrochen werden soll. Sie müssen also nursys.stdout = sys.__stdout__
das Backup speichern.Eine gute Möglichkeit, dies zu tun, besteht darin, einen kleinen Kontextprozessor zu erstellen, in den Sie Ihre Ausdrucke einwickeln. Sie verwenden dann nur is-in-a-
with
Anweisung, um alle Ausgaben stumm zu schalten.Python 2:
Python 3.4+:
Python 3.4 verfügt über einen Kontextprozessor wie diesen, sodass Sie die Kontextlib einfach wie folgt verwenden können:
Wenn Sie diesen Code ausführen, wird nur die zweite Ausgabezeile gedruckt, nicht die erste:
Dies funktioniert plattformübergreifend (Windows + Linux + Mac OSX) und ist sauberer als die anderen Antworten imho.
quelle
Wenn Sie in Python 3.4 oder höher arbeiten, gibt es eine einfache und sichere Lösung mit der Standardbibliothek:
quelle
with contextlib.redirect_stdout(None)
funktioniert auchAttributeError: 'NoneType' object has no attribute 'write'
write
Methode erstellen , die nichts bewirkt. Siehe meine Antwort unten.(zumindest auf meinem System) Es scheint, dass das Schreiben in os.devnull etwa fünfmal schneller ist als das Schreiben in eine DontPrint-Klasse, d. h
gab die folgende Ausgabe:
quelle
Wenn Sie sich in einer Unix-Umgebung befinden (einschließlich Linux), können Sie die Ausgabe umleiten an
/dev/null
:Und für Windows:
quelle
nul = myfunc()
?Wie wäre es damit:
Dadurch werden die Funktionen im contextlib- Modul verwendet, um die Ausgabe des Befehls, den Sie ausführen möchten, abhängig vom Ergebnis von auszublenden und das Ausgabeverhalten
should_hide_output()
wiederherzustellen, nachdem diese Funktion ausgeführt wurde.Wenn Sie die Standardfehlerausgabe ausblenden möchten, importieren Sie
redirect_stderr
auscontextlib
und fügen Sie eine Zeile mit der Aufschrift hinzustack.enter_context(redirect_stderr(null_stream))
.Der Hauptnachteil ist, dass dies nur in Python 3.4 und späteren Versionen funktioniert.
quelle
redirect_stdout()
Analog zu früheren Python-Versionen zu unterstützen (zcontextlib.contextmanager
. B. mit ) .Ihre Klasse funktioniert einwandfrei (mit Ausnahme des
write()
Methodennamens - er muss inwrite()
Kleinbuchstaben aufgerufen werden). Stellen Sie einfach sicher, dass Sie eine Kopie vonsys.stdout
in einer anderen Variablen speichern .Wenn Sie mit einem * NIX arbeiten, können Sie dies tun
sys.stdout = open('/dev/null')
, dies ist jedoch weniger portabel als das Rollen Ihrer eigenen Klasse.quelle
Sie können es einfach verspotten.
quelle
Warum versuchst du das nicht?
quelle
Es ist OK für den
print()
Fall. Es kann jedoch einen Fehler verursachen, wenn Sie eine Methode von sys.stdout aufrufen, zsys.stdout.write()
.In den Dokumenten ist ein Hinweis enthalten :
quelle
sys.stdout = Null
dies in einigen Fällen gefährlich sein.Ergänzung zur Antwort von iFreilicht - es funktioniert sowohl für Python 2 als auch für Python 3.
quelle