La réponse à la question est: Il existe différentes manières d'imprimer stderr en python mais cela dépend de 1.) quelle version de python nous utilisons 2.) quelle sortie exacte nous voulons.
La différence entre l'impression et la fonction d'écriture de stderr :
stderr : stderr (erreur standard) est un canal intégré à chaque système UNIX / Linux, lorsque votre programme se bloque et imprime des informations de débogage (comme une traceback en Python), il va au stderr tuyau.
impression : print est un wrapper qui formate les entrées (l'entrée est l'espace entre l'argument et la nouvelle ligne à la fin) et appelle ensuite la fonction d'écriture d'un objet donné, l'objet donné par défaut est sys.stdout, mais nous pouvons passer un fichier, c'est-à-dire que nous pouvons également imprimer l'entrée dans un fichier.
Python2: Si nous utilisons python2,
>>> import sys
>>> print "hi"
hi
>>> print("hi")
hi
>>> print >> sys.stderr.write("hi")
hi
En Python3, la virgule de fin Python2 est devenue un paramètre, donc si nous utilisons des virgules de fin pour éviter la nouvelle ligne après une impression, cela ressemblera en Python3 à print ('Text to print', end = '') qui est une erreur de syntaxe sous Python2 .
http://python3porting.com/noconv.html
Si nous vérifions le même sceario ci-dessus en python3:
>>> import sys
>>> print("hi")
hi
Sous Python 2.6, il y a une future importation pour faire de l'impression une fonction. Donc, pour éviter toute erreur de syntaxe et autres différences, nous devons démarrer tout fichier dans lequel nous utilisons print () avec la future import print_function. La future importation ne fonctionne que sous Python 2.6 et versions ultérieures, donc pour Python 2.5 et versions antérieures, vous avez deux options. Vous pouvez soit convertir l'impression plus complexe en quelque chose de plus simple, soit utiliser une fonction d'impression distincte qui fonctionne sous Python2 et Python3.
>>> from __future__ import print_function
>>>
>>> def printex(*args, **kwargs):
... print(*args, file=sys.stderr, **kwargs)
...
>>> printex("hii")
hii
>>>
Cas: Il convient de noter que sys.stderr.write () ou sys.stdout.write () (stdout (sortie standard) est un canal intégré à chaque système UNIX / Linux) ne remplace pas l'impression, mais oui nous pouvons l'utiliser comme alternative dans certains cas. Print est un wrapper qui enveloppe l'entrée avec un espace et une nouvelle ligne à la fin et utilise la fonction d'écriture pour écrire. C'est la raison pour laquelle sys.stderr.write () est plus rapide.
Remarque: nous pouvons également tracer et déboguer à l'aide de la journalisation
#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