Il y a plusieurs façons d'écrire sur stderr:
# 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)
Cela semble contredire le zen de Python # 13 † , alors quelle est la différence ici et y a-t-il des avantages ou des inconvénients d'une manière ou d'une autre? Quelle voie utiliser?
† Il devrait y avoir une - et de préférence une seule - façon évidente de le faire.
Réponses:
J'ai trouvé que c'était le seul court + flexible + portable + lisible:
La fonction
eprint
peut être utilisée de la même manière que laprint
fonction standard :la source
print
dans tout votre programme. Uniquement dans le module contenant la définition deeprint()
. Mettez-le dans un petit fichier par lui-même, importez-eprint
le dans vos autres fichiers et vous pouvez continuer à utiliser l'instructionprint
aussi longtemps que vous le souhaitez.Est mon choix, juste plus lisible et dit exactement ce que vous avez l'intention de faire et portable sur plusieurs versions.
Edit: être 'pythonic' est une troisième pensée pour moi sur la lisibilité et les performances ... avec ces deux choses à l'esprit, avec python 80% de votre code sera pythonic. la compréhension de la liste étant la «grande chose» qui n'est pas utilisée aussi souvent (lisibilité).
la source
print
instruction est l'impression facile des valeurs non-chaîne, sans avoir à les convertir d'abord. Si vous avez besoin d'une instruction print, je recommanderais donc d'utiliser la 3ème option pour être prêt pour python 3sys.stderr.write()
n'a rien à voirprint
. Il n'ajoute pas de nouvelle ligne.os.linesep
. C'est destderr
cela dont nous parlons, après tout. Je ne veux pas que la console se trompe avec la mauvaise nouvelle ligne.print >> sys.stderr
est parti en Python3. http://docs.python.org/3.0/whatsnew/3.0.html dit:Pour beaucoup d'entre nous, il semble quelque peu contre nature de reléguer la destination à la fin de la commande. L'alternative
semble plus orienté objet et passe avec élégance du générique au spécifique. Mais notez que ce
write
n'est pas un remplacement 1: 1 pourprint
.la source
print('spam', file=sys.stderr)
. Si vous le faites encore et encore, vous pouvez coder la fonction «eprint» comme dans la réponse la plus populaire, mais dans ce cas, je demanderais, qu'est-ce qui ne va pas avec la journalisation? stackoverflow.com/a/41304513/1450294with sys.stderr as dest:
avant un appel en retrait àprint("ERROR", file=dest)
Personne n'est
logging
encore mentionné , mais la journalisation a été créée spécifiquement pour communiquer les messages d'erreur. La configuration de base mettra en place un gestionnaire de flux écrivant sur stderr.Ce script:
a le résultat suivant lorsqu'il est exécuté sur la ligne de commande:
et bar.txt contiendra le «bonjour du monde» imprimé sur stdout.
la source
Pour Python 2, mon choix est le suivant:
print >> sys.stderr, 'spam'
parce que vous pouvez simplement imprimer des listes / dict, etc. sans les convertir en chaîne.print >> sys.stderr, {'spam': 'spam'}
au lieu de:sys.stderr.write(str({'spam': 'spam'}))
la source
"{0}".format({'spam': 'spam'})
toute façon, n'est-ce pas? Je dirais que vous devriez éviter de convertir explicitement en chaîne. Edit: j'ai accidentellement une grammaireJ'ai fait ce qui suit en utilisant Python 3:
Alors maintenant, je peux ajouter des arguments de mots clés, par exemple, pour éviter le retour chariot:
la source
Je dirais que votre première approche:
est le "Un ... moyen évident de le faire" Les autres ne satisfont pas à la règle n ° 1 ("Beau vaut mieux que laid.")
la source
>>
que cela signifie syntaxiquement? Je comprends que c'est un effort pour copier des bash>
, alors est-ce une syntaxe chausse-pied pour faire exactement cela?std::cout << "spam";
Cela imitera la fonction d'impression standard mais sortira sur stderr
la source
print
n'inclut pas de couleur.En Python 3, on peut simplement utiliser print ():
presque sorti de la boîte:
ou:
C'est simple et n'a pas besoin d'inclure quoi que ce soit d'autre
sys.stderr
.la source
ÉDITER Avec le recul, je pense que la confusion potentielle avec le changement de sys.stderr et le fait de ne pas voir le comportement mis à jour rend cette réponse pas aussi bonne que l'utilisation d'une fonction simple comme d'autres l'ont souligné.
L'utilisation de partiel ne vous fait économiser qu'une ligne de code. La confusion potentielle ne vaut pas la peine d'enregistrer 1 ligne de code.
original
Pour le rendre encore plus facile, voici une version qui utilise «partiel», ce qui est d'une grande aide dans les fonctions d'emballage.
Vous l'utilisez ensuite comme ça
Vous pouvez vérifier qu'il imprime sur stderr et non stdout en procédant comme suit (en remplaçant le code de http://coreygoldberg.blogspot.com.au/2009/05/python-redirect-or-turn-off-stdout-and .html ):
L'inconvénient de ceci est partiels ayants la valeur de sys.stderr à la fonction enroulée au moment de la création. Ce qui signifie que si vous redirigez stderr plus tard, cela n'affectera pas cette fonction. Si vous prévoyez de rediriger stderr, utilisez la méthode ** kwargs mentionnée par aaguirre sur cette page.
la source
Il en va de même pour la sortie standard:
Comme indiqué dans les autres réponses, l' impression offre une jolie interface qui est souvent plus pratique (par exemple pour imprimer des informations de débogage), tandis que l' écriture est plus rapide et peut également être plus pratique lorsque vous devez formater la sortie exactement d'une certaine manière. Je considérerais également la maintenabilité:
Vous pouvez ensuite décider de basculer entre stdout / stderr et un fichier normal.
La syntaxe de print () a changé en Python 3, donc si vous avez besoin de prendre en charge les deux versions, write () pourrait être mieux.
la source
from __future__ import print_function
est une meilleure façon de prendre en charge Python 2.6+ et Python 3.Je travaille en python 3.4.3. Je découpe un petit texte qui montre comment je suis arrivé ici:
Cela a-t-il fonctionné? Essayez de rediriger stderr vers un fichier et voyez ce qui se passe:
Eh bien, à part le fait que la petite introduction que python vous donne a été insinuée dans stderr (où cela irait-il?), Cela fonctionne.
la source
Si vous faites un test simple:
Vous constaterez que sys.stderr.write () est toujours 1,81 fois plus rapide!
la source
Si vous souhaitez quitter un programme en raison d'une erreur fatale, utilisez:
et
import sys
dans l'en-tête.la source
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,
http://python3porting.com/noconv.html
https://docs.python.org/2/library/logging.html#logger-objects
la source