Die Antwort auf die Frage lautet: Es gibt verschiedene Möglichkeiten, stderr in Python zu drucken, aber das hängt davon ab, 1.) welche Python-Version wir verwenden 2.) welche genaue Ausgabe wir wollen.
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
>>> import sys
>>> print "hi"
hi
>>> print("hi")
hi
>>> print >> sys.stderr.write("hi")
hi
Das nachgestellte Python2-Komma ist in Python3 zu einem Parameter geworden. Wenn wir also nach dem Drucken nachgestellte Kommas verwenden, um die neue Zeile zu vermeiden, sieht dies in Python3 wie print aus ('Text zum Drucken', end = ''), was unter Python2 ein Syntaxfehler ist .
http://python3porting.com/noconv.html
Wenn wir dasselbe oben in Python3 überprüfen:
>>> import sys
>>> print("hi")
hi
Unter Python 2.6 gibt es einen zukünftigen Import, um den Druck in eine Funktion zu verwandeln. Um Syntaxfehler und andere Unterschiede zu vermeiden, sollten wir jede Datei, in der wir print () verwenden, mit einer zukünftigen import print_function starten. Der zukünftige Import funktioniert nur unter Python 2.6 und höher. Für Python 2.5 und frühere Versionen stehen Ihnen zwei Optionen zur Verfügung. Sie können entweder den komplexeren Druck in etwas Einfacheres konvertieren oder eine separate Druckfunktion verwenden, die sowohl unter Python2 als auch unter Python3 funktioniert.
>>> from __future__ import print_function
>>>
>>> def printex(*args, **kwargs):
... print(*args, file=sys.stderr, **kwargs)
...
>>> printex("hii")
hii
>>>
Fall: Beachten Sie, dass sys.stderr.write () oder sys.stdout.write () (stdout (Standardausgabe) ist eine Pipe, die in jedes UNIX / Linux-System integriert ist) kein Ersatz für print ist, aber ja wir können es in einigen Fällen als Alternative verwenden. Print ist ein Wrapper, der die Eingabe am Ende mit Leerzeichen und Zeilenumbruch umschließt und zum Schreiben die Schreibfunktion verwendet. Dies ist der Grund, warum sys.stderr.write () schneller ist.
Hinweis: Wir können das Protokollieren und Debuggen auch mithilfe der Protokollierung durchführen
#test.py
import logging
logging.info('This is the existing protocol.')
FORMAT = "%(asctime)-15s %(clientip)s %(user)-8s %(message)s"
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logging.warning("Protocol problem: %s", "connection reset", extra=d)
https://docs.python.org/2/library/logging.html#logger-objects