La différence entre les sys.la sortie standard stdout.écrire et d'imprimer?
Sont là des situations dans lesquelles sys.stdout.write()
est préférable de print
?
(Exemples: de meilleures performances; le code qui est plus logique)
- La version de Python? 2.x ou 3.x?
- Honnêtement, je voudrais savoir pour les deux, même si je n'ai aucune expérience avec Python 3. Mise à jour de la question.
- demander les différences fondamentales entre
sys.stdout.write()
etprint
(et/ou pourquoi Python est à la fois) est une question parfaitement justifiée et n'a pas besoin d'exemples. L'OP n'a pas dit la syntaxe de la commande est source de confusion.
Vous devez vous connecter pour publier un commentaire.
print
est juste un wrapper mince que les formats d'entrées (modifiable, mais, par défaut, avec un espace entre args et de saut de ligne à la fin) et des appels à la fonction d'écriture d'un objet donné. Par défaut, cet objet estsys.stdout
, mais vous pouvez passer d'un fichier à l'aide de la "chevron" de la forme. Par exemple:Voir: https://docs.python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement
En Python 3.x,
print
devient une fonction, mais il est toujours possible de passer à autre chose quesys.stdout
grâce à lafile
argument.Voir https://docs.python.org/3/library/functions.html#print
En Python 2.6+,
print
est encore une déclaration, mais il peut être utilisé comme une fonction avecMise à jour: Bakuriu commenté à souligner qu'il y a une petite différence entre la fonction d'impression et l'impression (et plus généralement entre une fonction et une déclaration).
En cas d'erreur lors de l'évaluation des arguments:
print
ajoute également une nouvelle ligne de ce que vous écrivez et qui n'arrive pas avecsys.stdout.write
.sys.stdout.write
est plus universel si vous avez besoin d'écrire à double version de code (par exemple le code qui fonctionne simultanément avec Python 2.x ainsi que Python 3.x).print
ajoute avec une virgule:print "this",; print "on the same line as this"
>>
, ou__rshift__
, l'opérateur?>>
n'est pas le rshift opérateur ici, mais un "chevron" forme de laprint
déclaration. Voir docs.python.org/2/reference/...sys.stdout.write()
aussi les tampons d'entrée et pourrait ne pas rincer à l'entrée de la fd immédiatement. afin de s'assurer qu'il se comporte comme la fonction d'impression, vous devez ajouter:sys.stdout.flush()
print(blah, end="")
pour éviter un retour à la ligne dans la presse.print
première convertit l'objet en une chaîne (si ce n'est pas déjà une chaîne de caractères). Il sera également placer un espace avant de l'objet, si ce n'est pas le début d'une ligne et d'un caractère de saut de ligne à la fin.Lors de l'utilisation de
stdout
, vous avez besoin de convertir l'objet en une chaîne à vous-même (en appelant "str", par exemple) et il n'y a pas de caractère de saut de ligne.Donc
est équivalent à:
print
et.write()
, je dirais.print
peuvent être formulées pour supprimer le saut de ligne. En Python 2.x, mettre une virgule à la fin, et un caractère d'espace de sortie, mais pas de saut de ligne. E. g.print 99,
En Python 3,print(..., end='')
permettra d'éviter l'ajout d'un saut de ligne (et aussi éviter d'ajouter de l'espace, à moins que vous neend=' '
.print
opération se comporte de façon légèrement différente dans les gestionnaires de signaux en python2.X, c'est à dire d'impression ne peut pas être remplacé par sys.stdout dans l'exemple: stackoverflow.com/questions/10777610/...Après avoir terminé le développement d'un script, l'autre jour, je l'ai transféré sur un serveur unix. Tous mes messages de débogage utilisés
print
états, et ces ne pas apparaissent sur un serveur de journal.C'est un cas où vous pourriez avoir besoin
sys.stdout.write
à la place.print()
etsys.stdout.write()
, par opposition à la différence entrestdout
etstderr
? Pour le débogage, vous devez utiliser lelogging
module, qui imprime des messages àstderr
.nohup
et de les rediriger vers une.out
fichier.nohup
, par défaut, tout écrit àstdout
etstderr
serez re-dirigé ànohup.out
, ignorant si vous utilisezprint
oustdout.write
.Voici un exemple de code, basé sur le livre Apprentissage de Python par Mark Lutz qui répond à vos question:
D'ouverture log.txt dans un éditeur de texte va révéler le suivant:
Il y a au moins une situation dans laquelle vous souhaitez
sys.stdout
au lieu de les imprimer.Lorsque vous souhaitez remplacer une ligne sans passer à la ligne suivante, par exemple lors du dessin d'une barre de progression ou un message d'état, vous avez besoin de faire une boucle sur quelque chose comme
Et depuis imprimer ajoute un saut de ligne, vous êtes mieux d'utiliser
sys.stdout
.Si vous écrivez une application en ligne de commande qui peut écrire à la fois des fichiers et stdout alors qu'il est à portée de main. Vous pouvez faire des choses comme:
Cela signifie que vous ne pouvez pas utiliser la
with open(outfile, 'w') as out:
modèle, mais parfois, il vaut la peine.with
--def process(output): # ...
/if outfile is None: process(sys.stdout) else: with open(outfile, 'w') as out: process(out)
(ajouter des retours à la ligne si nécessaire bien sûr). Ce n'est certainement pas très propre, bien, c'est sûr.En 2.x, le
print
déclaration prétraite ce que vous lui donnez, en le transformant en des chaînes le long de la voie, de la manipulation des séparateurs et des retours à la ligne, et en permettant la redirection vers un fichier. 3.x elle tourne à une fonction, mais il a toujours les mêmes responsabilités.sys.stdout
est un fichier ou de fichiers qui possède des méthodes pour l'écrit qui prennent des chaînes ou quelque chose le long de cette ligne.il est préférable lors de l'impression dynamique est utile, par exemple, donner des informations dans un long processus:
Par exemple, je travaille sur une petite fonction qui imprime des étoiles dans la pyramide format au passage le nombre comme argument, bien que vous pouvez accomplir cela en utilisant end="" à imprimer dans une autre ligne, j'ai utilisé sys.la sortie standard stdout.écrire en coordination avec impression pour faire ce travail. Pour revenir sur ce stdout.écrire imprime dans la même ligne où que impression toujours imprime son contenu dans une ligne distincte.
J'ai trouvé que stdout fonctionne mieux que d'imprimer en multithreading situation. J'utilise de la File d'attente (FIFO) pour stocker les lignes à imprimer et je tiens tous les fils avant de la ligne d'impression jusqu'à ce que mon impression Q est vide. Même si, en utilisant l'impression que j'ai parfois de perdre la finale de \n dans le débogage I/O (à l'aide de l'aile pro IDE).
Lorsque j'utilise std.avec \n dans la chaîne de débogage I/O formats correctement et les \n sont correctement affichés.
En Python 3, il est valide en raison de l'utilisation d'imprimer sur
sys.stdout.write
, mais ce motif peut aussi être transformé en raison de l'utilisation d'sys.stdout.write
à la place.Cette raison en est que, maintenant, l'impression est une fonction en Python 3, vous pouvez le modifier. De sorte que vous pouvez imprimer partout dans un script simple et décider de les imprimer les déclarations doivent écrire à
stderr
à la place. Vous pouvez maintenant simplement de redéfinir la fonction d'impression, vous pouvez même changer la fonction d'impression mondiale en la changeant en utilisant les objets internes du module. Bien sûr avecfile.write
vous pouvez spécifier ce fichier, mais avec l'écrasement d'impression vous pouvez également redéfinir le séparateur de ligne, ou argument séparateur.L'autre manière autour. Peut-être que vous êtes absolument certain de vous écrire pour
stdout
, mais aussi de savoir que vous allez changer d'impression de quelque chose d'autre, vous pouvez décider d'utilisersys.stdout.write
, et l'utilisation de l'impression pour le journal d'erreur ou quelque chose d'autre.Donc, ce que vous utilisez dépend de la façon dont vous avez l'intention de l'utiliser.
print
est plus souple, mais qui peut être une raison de l'utiliser et de ne pas l'utiliser. Je serais encore opter pour la flexibilité au lieu de cela, et choisir imprimer. Une autre raison d'utiliserprint
la place, c'est la familiarité. Plus de gens vont maintenant ce que tu veux dire par impression et moins savoirsys.stdout.write
.En observant l'exemple ci-dessus:
sys.stdout.write
n'est pas écrire non-objet de type string, maisprint
serasys.stdout.write
ne sera pas ajouter un nouveau symbole de ligne à la fin, maisprint
seraSi nous plonge profondément,
sys.stdout
est un objet de fichier qui peut être utilisé pour la sortie de print()si le fichier argument de
print()
n'est pas spécifié,sys.stdout
sera utiliséUn de la différence est la suivante, lorsque vous essayez d'imprimer un octet dans son hexadécimal apparence. Par exemple, nous savons que la valeur décimale de
255
est0xFF
en hexadécimal apparence: