La risposta alla domanda è: Esistono diversi modi per stampare stderr in Python ma ciò dipende da 1.) quale versione di Python stiamo usando 2.) quale output esatto vogliamo.
La differenza tra print e la funzione di scrittura di stderr :
stderr : stderr (errore standard) è una pipe integrata in ogni sistema UNIX / Linux, quando il programma si arresta in modo anomalo e stampa informazioni di debug (come un traceback in Python), va allo stderr tubo.
Stampa : print è un wrapper che formatta gli input (l'input è lo spazio tra argomento e la nuova riga alla fine) e quindi chiama la funzione di scrittura di un determinato oggetto, l'oggetto dato di default è sys.stdout, ma possiamo passare un file, cioè possiamo anche stampare l'input in un file.
Python2: Se stiamo usando python2, allora
>>> import sys
>>> print "hi"
hi
>>> print("hi")
hi
>>> print >> sys.stderr.write("hi")
hi
La virgola finale di Python2 è diventata un parametro in Python3, quindi se usiamo le virgole finali per evitare la nuova riga dopo una stampa, in Python3 sembrerà print ('Text to print', end = '') che è un errore di sintassi in Python2 .
http://python3porting.com/noconv.html
Se controlliamo lo stesso sopra sceario in python3:
>>> import sys
>>> print("hi")
hi
In Python 2.6 c'è un'importazione futura per rendere la stampa in una funzione. Quindi, per evitare errori di sintassi e altre differenze, dovremmo iniziare qualsiasi file in cui utilizziamo print () dalla futura import print_function. L' importazione futura funziona solo con Python 2.6 e versioni successive, quindi per Python 2.5 e versioni precedenti hai due opzioni. Puoi convertire la stampa più complessa in qualcosa di più semplice oppure puoi utilizzare una funzione di stampa separata che funziona sia con Python2 che con Python3.
>>> from __future__ import print_function
>>>
>>> def printex(*args, **kwargs):
... print(*args, file=sys.stderr, **kwargs)
...
>>> printex("hii")
hii
>>>
Caso: si noti che sys.stderr.write () o sys.stdout.write () (stdout (output standard) è una pipe integrata in ogni sistema UNIX / Linux) non è un sostituto per la stampa, ma sì possiamo usarlo come alternativa in alcuni casi. Stampa è un wrapper che avvolge l'input con spazio e newline alla fine e utilizza la funzione di scrittura per scrivere. Questo è il motivo per cui sys.stderr.write () è più veloce.
Nota: possiamo anche tracciare ed eseguire il debug utilizzando la registrazione
#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