Es gibt verschiedene Möglichkeiten, an stderr zu schreiben:
# Note: this first one does not work in Python 3
print >> sys.stderr, "spam"
sys.stderr.write("spam\n")
os.write(2, b"spam\n")
from __future__ import print_function
print("spam", file=sys.stderr)
Das scheint dem Zen von Python # 13 † zu widersprechen. Was ist hier also der Unterschied und gibt es auf die eine oder andere Weise Vor- oder Nachteile? Welcher Weg sollte verwendet werden?
† Es sollte einen - und vorzugsweise nur einen - offensichtlichen Weg geben, dies zu tun.
Antworten:
Ich fand dies die einzige kurze + flexible + tragbare + lesbare:
Die Funktion
eprint
kann auf die gleiche Weise wie die Standardfunktion verwendetprint
werden:quelle
print
in dem gesamten Programm. Nur in dem Modul, das die Definition von enthälteprint()
. Legen Sie es selbst in eine kleine Datei, importieren Sieeprint
es in Ihre anderen Dateien, und Sie können die Anweisungprint
so lange verwenden, wie Sie möchten.Ist meine Wahl, nur besser lesbar und genau das zu sagen, was Sie vorhaben, und über Versionen hinweg portierbar.
Bearbeiten: "Pythonisch" zu sein, ist für mich ein dritter Gedanke in Bezug auf Lesbarkeit und Leistung. In Anbetracht dieser beiden Aspekte werden bei Python 80% Ihres Codes pythonisch sein. Listenverständnis ist das "große Ding", das nicht so oft verwendet wird (Lesbarkeit).
quelle
print
Anweisung ist das einfache Drucken von Nicht-String-Werten, ohne dass diese zuerst konvertiert werden müssen. Wenn Sie einesys.stderr.write()
ist nichts wieprint
. Es wird keine neue Zeile hinzugefügt.os.linesep
. Das iststderr
es doch, worüber wir reden. Ich möchte nicht, dass die Konsole den falschen Zeilenumbruch durcheinander bringt.print >> sys.stderr
ist in Python3 weg. http://docs.python.org/3.0/whatsnew/3.0.html sagt:Für viele von uns ist es etwas unnatürlich, das Ziel bis zum Ende des Befehls zu verbannen. Die Alternative
sieht objektorientierter aus und geht elegant vom Generischen zum Spezifischen. Beachten Sie jedoch, dass dies
write
kein 1: 1-Ersatz für istprint
.quelle
print('spam', file=sys.stderr)
. Wenn Sie es immer und immer wieder tun, können Sie die 'eprint'-Funktion wie in der beliebtesten Antwort codieren, aber in diesem Fall würde ich fragen, was ist falsch an der Protokollierung? stackoverflow.com/a/41304513/1450294with sys.stderr as dest:
vor einem eingerückten Anruf anprint("ERROR", file=dest)
Bisher wurde
logging
noch niemand erwähnt , aber die Protokollierung wurde speziell für die Übermittlung von Fehlermeldungen erstellt. Durch die Grundkonfiguration wird ein Stream-Handler eingerichtet, der in stderr schreibt.Dieses Skript:
hat das folgende Ergebnis, wenn es in der Befehlszeile ausgeführt wird:
und bar.txt enthält die auf stdout gedruckte 'Hallo Welt'.
quelle
Für Python 2 habe ich die Wahl:
print >> sys.stderr, 'spam'
Weil Sie einfach Listen / Diktate usw. drucken können, ohne sie in einen String umzuwandeln.print >> sys.stderr, {'spam': 'spam'}
anstatt:sys.stderr.write(str({'spam': 'spam'}))
quelle
"{0}".format({'spam': 'spam'})
, wäre sowieso so etwas , oder? Ich würde sagen, Sie sollten es vermeiden, explizit in einen String zu konvertieren. Edit: Ich habe versehentlich eine GrammatikIch habe Folgendes mit Python 3 gemacht:
Jetzt kann ich beispielsweise Schlüsselwortargumente hinzufügen, um Wagenrücklauf zu vermeiden:
quelle
Ich würde sagen, dass Ihr erster Ansatz:
ist der "Eine ... offensichtliche Weg, es zu tun" Die anderen erfüllen Regel 1 nicht ("Schön ist besser als hässlich.")
quelle
>>
syntaktisch? Ich verstehe, dass es eine Anstrengung ist, Bashs zu kopieren. Ist>
es also eine Schuhlöffel-Syntax, genau das zu tun?std::cout << "spam";
Dies ahmt die Standarddruckfunktion nach, wird jedoch auf stderr ausgegeben
quelle
print
beinhaltet keine Spülung.In Python 3 kann man einfach print () verwenden:
fast out of the box:
oder:
Dies ist unkompliziert und muss nichts anderes enthalten
sys.stderr
.quelle
BEARBEITEN Im Nachhinein denke ich, dass die mögliche Verwechslung mit dem Ändern von sys.stderr und dem Nicht-Aktualisieren des Verhaltens dazu führt, dass diese Antwort nicht so gut ist, wie nur eine einfache Funktion zu verwenden, wie andere darauf hingewiesen haben.
Wenn Sie teilweise verwenden, sparen Sie nur 1 Codezeile. Die mögliche Verwirrung ist es nicht wert, 1 Codezeile zu speichern.
Original
Um es noch einfacher zu machen, gibt es hier eine Version, die 'partiell' verwendet, was eine große Hilfe beim Umschließen von Funktionen ist.
Sie verwenden es dann so
Sie können überprüfen, ob es auf stderr und nicht auf stdout gedruckt wird, indem Sie die folgenden Schritte ausführen (übergeordneter Code von http://coreygoldberg.blogspot.com.au/2009/05/python-redirect-or-turn-off-stdout-and) .html ):
Der Nachteil ist , teilweise Abtretungs den Wert sys.stderr zur gewickelten Funktion zum Zeitpunkt der Erstellung. Das heißt, wenn Sie stderr später umleiten, wird diese Funktion nicht beeinträchtigt. Wenn Sie stderr umleiten möchten, verwenden Sie die von aaguirre auf dieser Seite erwähnte ** kwargs-Methode .
quelle
Gleiches gilt für stdout:
Wie in den anderen Antworten angegeben, bietet print eine hübsche Oberfläche, die häufig bequemer ist (z. B. zum Drucken von Debug-Informationen), während das Schreiben schneller ist und auch bequemer sein kann, wenn Sie die Ausgabe auf bestimmte Weise genau formatieren müssen. Ich würde auch die Wartbarkeit in Betracht ziehen:
Sie können später entscheiden, zwischen stdout / stderr und einer regulären Datei zu wechseln.
Die Syntax von print () hat sich in Python 3 geändert. Wenn Sie also beide Versionen unterstützen müssen, ist write () möglicherweise besser.
quelle
from __future__ import print_function
ist eine bessere Möglichkeit, sowohl Python 2.6+ als auch Python 3 zu unterstützen.Ich arbeite in Python 3.4.3. Ich schneide eine kleine Eingabe aus, die zeigt, wie ich hierher gekommen bin:
Hat es funktioniert? Versuchen Sie, stderr in eine Datei umzuleiten, und sehen Sie, was passiert:
Nun, abgesehen von der Tatsache, dass die kleine Einführung, die Python Ihnen gibt, in stderr geschlürft wurde (wohin würde es sonst gehen?), Funktioniert es.
quelle
Wenn Sie einen einfachen Test durchführen:
Sie werden feststellen, dass sys.stderr.write () durchweg 1,81- mal schneller ist!
quelle
Wenn Sie ein Programm aufgrund eines schwerwiegenden Fehlers beenden möchten, verwenden Sie:
und
import sys
in der Kopfzeile.quelle
Der Unterschied zwischen print und der Schreibfunktion von stderr : stderr : stderr (Standardfehler) ist eine Pipe, die in jedes UNIX / Linux-System integriert ist. Wenn Ihr Programm abstürzt und Debugging-Informationen ausgibt (wie ein Traceback in Python), geht es an stderr Rohr.
print : print ist ein Wrapper, der die Eingaben formatiert (die Eingabe ist das Leerzeichen zwischen Argument und Zeilenumbruch am Ende) und dann die Schreibfunktion eines bestimmten Objekts aufruft. Das angegebene Objekt ist standardmäßig sys.stdout, aber wir können Übergeben Sie eine Datei, dh wir können die Eingabe auch in einer Datei drucken.
Python2: Wenn wir dann Python2 verwenden
http://python3porting.com/noconv.html
https://docs.python.org/2/library/logging.html#logger-objects
quelle