web-dev-qa-db-fra.com

La différence entre sys.stdout.write et print?

Existe-t-il des situations dans lesquelles sys.stdout.write() est préférable à print?

(Exemples: meilleures performances; un code plus logique)

329
Johanna Larsson

print est juste un fin wrapper qui formate les entrées (modifiable, mais par défaut avec un espace entre les arguments et les nouvelles lignes à la fin) et appelle la fonction write d'un objet donné. Par défaut, cet objet est sys.stdout, mais vous pouvez transmettre un fichier en utilisant le formulaire "chevron". Par exemple:

print >> open('file.txt', 'w'), 'Hello', 'World', 2+3

Voir: https://docs.python.org/2/reference/simple_stmts.html?highlight=print#the-print-statement


Dans Python 3.x, print devient une fonction, mais il est toujours possible de passer autre chose que sys.stdout grâce à l'argument file.

print('Hello', 'World', 2+3, file=open('file.txt', 'w'))

Voir https://docs.python.org/3/library/functions.html#print


Dans Python 2.6+, print est toujours une instruction, mais il peut être utilisé comme une fonction avec

from __future__ import print_function

Mise à jour: Bakuriu a fait remarquer qu'il y avait une petite différence entre la fonction print et l'instruction print (et plus généralement entre une fonction et une instruction).

En cas d'erreur lors de l'évaluation des arguments:

print "something", 1/0, "other" #prints only something because 1/0 raise an Exception

print("something", 1/0, "other") #doesn't print anything. The function is not called
260
luc

print convertit d'abord l'objet en une chaîne (s'il ne s'agit pas déjà d'une chaîne). Il mettra également un espace avant l'objet si ce n'est pas le début d'une ligne et un caractère de nouvelle ligne à la fin.

Lorsque vous utilisez stdout, vous devez convertir vous-même l'objet en chaîne (en appelant "str", par exemple) et il n'y a pas de caractère de nouvelle ligne.

Alors

print 99

est équivalent à:

import sys
sys.stdout.write(str(99) + '\n')
138
dogbane

Ma question est de savoir s'il existe ou non des situations dans lesquelles sys.stdout.write() est préférable à print

Après avoir fini de développer un script l'autre jour, je l'ai téléchargé sur un serveur Unix. Tous mes messages de débogage utilisaient des instructions print, et celles-ci ne le font pas apparaissent dans un journal du serveur.

Dans ce cas, vous aurez peut-être besoin de sys.stdout.write.

39
LiamSullivan

Voici un exemple de code basé sur le livre Learning Python de Mark Lutz qui répond à votre question:

import sys
temp = sys.stdout                 # store original stdout object for later
sys.stdout = open('log.txt', 'w') # redirect all prints to this log file
print("testing123")               # nothing appears at interactive Prompt
print("another line")             # again nothing appears. it's written to log file instead
sys.stdout.close()                # ordinary file object
sys.stdout = temp                 # restore print commands to interactive Prompt
print("back to normal")           # this shows up in the interactive Prompt

Ouvrir log.txt dans un éditeur de texte révélera les éléments suivants:

testing123
another line
35
Will Townes

Il existe au moins une situation dans laquelle vous souhaitez sys.stdout au lieu de l’impression.

Lorsque vous souhaitez écraser une ligne sans passer à la ligne suivante, par exemple en dessinant une barre de progression ou un message d'état, vous devez effectuer une boucle comme par exemple

Note carriage return-> "\rMy Status Message: %s" % progress

Et comme print ajoute une nouvelle ligne, il vaut mieux utiliser sys.stdout.

11
Carlos

Ma question est de savoir s'il existe ou non des situations dans lesquelles sys.stdout.write() est préférable à print

Si vous écrivez une application en ligne de commande capable d’écrire à la fois sur des fichiers et sur stdout, c’est pratique. Vous pouvez faire des choses comme:

def myfunc(outfile=None):
    if outfile is None:
        out = sys.stdout
    else:
        out = open(outfile, 'w')
    try:
        # do some stuff
        out.write(mytext + '\n')
        # ...
    finally:
        if outfile is not None:
            out.close()

Cela signifie que vous ne pouvez pas utiliser le motif with open(outfile, 'w') as out:, mais parfois cela en vaut la peine.

8
Hamish Downer

Dans la version 2.x, l'instruction print pré-traite ce que vous lui donnez, la transformant en chaînes le long du chemin, gérant les séparateurs et les nouvelles lignes et permettant la redirection vers un fichier. 3.x le transforme en une fonction, mais il a toujours les mêmes responsabilités.

sys.stdout est un fichier ou un fichier qui possède des méthodes pour l'écriture, qui prennent des chaînes ou quelque chose le long de cette ligne.

3

Existe-t-il des situations dans lesquelles sys.stdout.write () est préférable d’imprimer?

J'ai trouvé que stdout fonctionne mieux que print dans une situation de multithreading. J'utilise la file d'attente (FIFO) pour stocker les lignes à imprimer et je conserve tous les fils avant la ligne d'impression jusqu'à ce que mon Q d'impression soit vide. Malgré cela, en utilisant print, je perds parfois le dernier\n sur les E/S de débogage (avec wing pro IDE).

Lorsque j'utilise std.out avec\n dans la chaîne, les formats d'E/S de débogage et les\n s'affichent correctement.

1
David Poundall

Existe-t-il des situations dans lesquelles sys.stdout.write () est préférable d’imprimer?

Par exemple, je travaille sur une petite fonction qui imprime des étoiles au format pyramide en passant le nombre en argument, bien que vous puissiez le faire en utilisant end = "" pour imprimer sur une ligne séparée, j’ai utilisé sys.stdout.write en coordination avec print pour que cela fonctionne. Pour élaborer sur ceci stdout.write imprime dans la même ligne que print imprime toujours son contenu sur une ligne séparée.

import sys

def printstars(count):

    if count >= 1:
        i = 1
        while (i <= count):
            x=0
            while(x<i):
                sys.stdout.write('*')
                x = x+1
            print('')
            i=i+1

printstars(5)
1
Sree

il est préférable, lorsque l’impression dynamique est utile, par exemple, de donner des informations dans un long processus:

import time, sys
Iterations = 555
for k in range(Iterations+1):
    # some code to execute here ...
    percentage = k / Iterations
    time_msg = "\rRunning Progress at {0:.2%} ".format(percentage)
    sys.stdout.write(time_msg)
    sys.stdout.flush()
    time.sleep(0.01)
1
Hamidreza

Dans Python 3, il existe une raison valable d'utiliser print sur sys.stdout.write, mais cette raison peut également être transformée en une raison d'utiliser sys.stdout.write à la place.

Cette raison est que, maintenant, print est une fonction dans Python 3, vous pouvez le remplacer. Vous pouvez donc utiliser print partout dans un script simple et décider que les instructions print doivent écrire à stderr à la place. Vous pouvez maintenant simplement redéfinir la fonction d'impression, vous pouvez même changer la fonction d'impression globale en la modifiant à l'aide du module builtins. Bien sûr, avec file.write, vous pouvez spécifier le fichier, mais en écrasant l'impression, vous pouvez également redéfinir le séparateur de lignes ou le séparateur d'arguments.

Le contraire est. Peut-être que vous êtes absolument certain d'écrire sur stdout, mais que vous savez également que vous allez modifier l'impression, vous pouvez décider d'utiliser sys.stdout.write et d'utiliser print pour le journal des erreurs ou autre chose.

Donc, ce que vous utilisez dépend de la façon dont vous avez l’intention de l’utiliser. print est plus flexible, mais cela peut être une raison d'utiliser et de ne pas l'utiliser. Je préférerais quand même opter pour la flexibilité et choisir l’impression. Une autre raison d'utiliser print à la place est la familiarité. Plus de gens vont maintenant comprendre ce que vous voulez dire par écrit et moins vous en savez sys.stdout.write.

1
Hielke Walinga
>>> sys.stdout.write(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected a string or other character buffer object
>>> sys.stdout.write("a")
a>>> sys.stdout.write("a") ; print(1)
a1

En observant l'exemple ci-dessus:

  1. sys.stdout.write n'écrira pas d'objet non-chaîne, mais print

  2. sys.stdout.write n’ajoutera pas de nouveau symbole de ligne à la fin, mais print

Si nous plongeons profondément,

sys.stdout est un objet fichier pouvant être utilisé pour la sortie de print ()

si l'argument de fichier de print() n'est pas spécifié, sys.stdout sera utilisé

0
GraceMeng