Je veux exécuter un script qui montre de manière simple des choses comme:
Installing XXX... [DONE]
Maintenant, pour le moment, j'utilise print pour imprimer toute la ligne APRÈS que la fonction ait réussi. Cependant, je souhaite maintenant que le message "Installation de xxx ..." soit imprimé en premier, et APRES que la fonction ait été exécutée, pour ajouter la balise "DONE"; mais sur la même ligne.
Des idées?
Vous pouvez utiliser l'instruction print
pour le faire sans importer sys
.
def install_xxx():
print "Installing XXX... ",
install_xxx()
print "[DONE]"
La virgule à la fin de la ligne print
empêche print
de créer une nouvelle ligne (notez qu'il y aura un espace supplémentaire à la fin de la sortie).
La solution Python
Puisque ce qui précède ne fonctionne pas dans Python 3, vous pouvez le faire à la place (encore une fois, sans importer sys
):
def install_xxx():
print("Installing XXX... ", end="", flush=True)
install_xxx()
print("[DONE]")
La fonction d'impression accepte un paramètre end
dont le paramètre par défaut est "\n"
. Le définir sur une chaîne vide l'empêche d'émettre une nouvelle ligne à la fin de la ligne.
Vous pouvez simplement utiliser ceci:
print 'something',
...
print ' else',
et la sortie sera
something else
inutile de surcharger de import sys
. Faites attention à la virgule à la fin.
Python 3 +print("some string", end="");
pour supprimer l'insertion de nouvelle ligne à la fin. Lire plus par help(print);
Vous devez utiliser un retour arrière '\r ' ou ('\x08 ' ) char pour revenir à la position précédente dans la sortie de la console
Python 2+:
import time
import sys
def backspace(n):
sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
sys.stdout.write(s) # just print
sys.stdout.flush() # needed for flush when using \x08
backspace(len(s)) # back n chars
time.sleep(0.2) # sleep for 200ms
Python 3:
import time
def backline():
print('\r', end='') # use '\r' to go back
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
print(s, end='') # just print and flush
backline() # back to the beginning of line
time.sleep(0.2) # sleep for 200ms
Ce code comptera de 0% à 100% sur une ligne. La valeur finale sera:
> python test.py
100%
Des informations supplémentaires sur flush dans ce cas ici: Pourquoi python les instructions print contenant les arguments 'end =' se comportent-elles différemment dans les boucles while??
Utilisez sys.stdout.write('Installing XXX... ')
et sys.stdout.write('Done')
. De cette façon, vous devez ajouter la nouvelle ligne à la main avec "\n"
si vous souhaitez recréer la fonctionnalité d'impression. Je pense qu'il serait peut-être inutile d'utiliser des malédictions rien que pour ça.
Aucune des réponses n'a fonctionné pour moi, car ils ont tous fait une pause jusqu'à ce qu'une nouvelle ligne a été rencontrée. J'ai écrit une aide simple:
def print_no_newline(string):
import sys
sys.stdout.write(string)
sys.stdout.flush()
Pour le tester:
import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')
"Bonjour" sera d'abord imprimé et affiché à l'écran avant le sommeil. Après cela, vous pouvez utiliser une impression standard.
sys.stdout.write
imprimera sans chariot de retour
import sys
sys.stdout.write("installing xxx")
sys.stdout.write(".")
http://en.wikibooks.org/wiki/Python_Programming/Input_and_output#printing_without_commas_or_newlines
Cet exemple simple imprimera 1-10 sur la même ligne.
for i in range(1,11):
print (i, end=" ")
L'impression a un argument de fin optionnel, c'est ce qui a été imprimé à la fin. La valeur par défaut est newline mais vous pouvez le changer en chaîne vide. par exemple: print ("hello world!", end = "")
print(‘\r’+’something to be override’,end=‘’)
Cela signifie que le curseur reviendra au début, puis imprimera quelque chose et se terminera sur la même ligne. S'il est en boucle, il commencera à imprimer au même endroit.
Si vous souhaitez écraser la ligne précédente (au lieu de l'ajouter continuellement), vous pouvez combiner \r
avec print(),
à la fin de l'instruction d'impression. Par exemple,
from time import sleep
for i in xrange(0, 10):
print("\r{0}".format(i)),
sleep(.5)
print("...DONE!")
comptera de 0 à 9, remplaçant l’ancien numéro dans la console. Le "...DONE!"
imprimera sur la même ligne que le dernier compteur, 9.
Dans le cas de l'OP, cela permettrait à la console d'afficher le pourcentage d'achèvement de l'installation sous la forme d'une "barre de progression" dans laquelle vous pouvez définir la position des caractères de début et de fin et mettre à jour les marqueurs entre les deux.
print("Installing |XXXXXX | 30%"),
Voici une version compatible 2.7 dérivée de la version 3.0 de @ Vadim-Zin4uk:
Python 2
import time
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
print '{0}\r'.format(s), # just print and flush
time.sleep(0.2)
D'ailleurs, la solution 3.0 fournie semble un peu gonflée. Par exemple, la méthode de retour arrière n'utilise pas l'argument entier et pourrait probablement être supprimée complètement.
Python
import time
for i in range(101): # for 0 to 100
s = str(i) + '%' # string for output
print('{0}\r'.format(s), end='') # just print and flush
time.sleep(0.2) # sleep for 200ms
Les deux ont été testés et fonctionnent.
C'est un très vieux sujet, mais voici une réponse très complète et un exemple de code.
\r
est la représentation sous forme de chaîne de retour à la ligne à partir du jeu de caractères ASCII. C'est la même chose que 015
[chr(0o15)
] ou hexidécimal 0d
[chr(0x0d)
] ou décimal 13
[chr(13)
]. Voir man ascii
pour une lecture ennuyeuse. Il (\r
) est une représentation assez portable et assez facile à lire. Il s’agit tout simplement de déplacer le chariot de la machine à écrire jusqu’au début sans faire avancer le papier. C'est la CR
partie de CRLF
qui signifie retour chariot et saut de ligne.
print()
est une fonction dans Python 3. Dans Python 2 (toute version que vous souhaiteriez utiliser), print
peut être forcé dans une fonction en important son définition du module __future__
. L'avantage de la fonction print
est que vous pouvez spécifier quoi imprimer à la fin, en remplaçant le comportement par défaut de \n
pour imprimer une nouvelle ligne à la fin de chaque appel print()
.
sys.stdout.flush
indique à Python de vider la sortie de sortie standard, à l'endroit où vous envoyez la sortie avec print()
, sauf indication contraire. Vous pouvez également obtenir le même comportement en utilisant python -u
ou en définissant la variable d'environnement PYTHONUNBUFFERED=1
, en ignorant ainsi les appels import sys
et sys.stdout.flush()
. Le montant que vous gagnez en faisant cela est presque exactement zéro et il n'est pas très facile de déboguer si vous oubliez facilement que vous devez effectuer cette étape avant que votre application ne se comporte correctement.
Et un échantillon. Notez que cela fonctionne parfaitement dans Python 2 ou 3.
from __future__ import print_function
import sys
import time
ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}
for i in range(1, ANS + 1):
if i in FACTORS:
print('\r{0:d}'.format(i), end='')
sys.stdout.flush()
time.sleep(ANS / 100.0)
else:
print()
Juste au cas où vous avez pré-stocké les valeurs dans un tableau, vous pouvez les appeler au format suivant:
for i in range(0,n):
print arr[i],
print () a un paramètre intégré "end" qui est défini par défaut sur "\ n" L'appel de print ("This is America") appelle en fait print ("This is America", end = "\ n"). Une façon simple de faire est d'appeler print ("This is America", end = "")