URL: https://linuxfr.org/forums/programmation-python/posts/sys-stdout-write-avec-python3-pas-d-ecriture-tant-que-pas-eol Title: sys.stdout.write() avec python3 : pas d'écriture tant que pas EOL ? Authors: Thomas Debesse Date: 2013年01月18日T14:28:33+01:00 License: CC By-SA Tags: Score: 3 Bonjour, je me fais la main sur python et j'ai un bug douteux avec python3. Voici un code simple, une espèce de shell : ```python #!/usr/bin/env python # -*- coding: utf-8 -*- import sys prompt='prompt> ' while True: sys.stdout.write(prompt) line = sys.stdin.readline().split('\n', 1)[0] sys.stdout.write('read: "' + line + '"\n') ``` Voilà ce qui se passe lorsque je l'interprète avec python : ``` prompt> test read: "test" ``` Le prompt est affiché, et mon curseur est placé après le prompt, ce qui montre que ``sys.stdout.write()`` a bien écrit sur la sortie standard avant que ``sys.stdin.readline()`` ne lise l'entrée standard. Mais voilà, dès que je passe à python3, c'est le drame Je change le shebang de mon petit script en ```python #!/usr/bin/env python3 ``` et je relance mon script, et j'obtiens : ``` test prompt> read: "test" ``` le prompt est affiché qu'après avoir écrit ma commande, c'est comme si ``sys.stdout.write()`` était interprété après ``sys.stdin.readline()``. En fait c'est plus fin que ça, certains au fond lèveront la main pour demander _« mais pourquoi retirer '\n' pour l'afficher ensuite »_. Tout à fait, je fais ça dans cet exemple pour être certain que c'est _moi_ qui demande son impression, et qu'il n'est implicite nulle-part. En fait voilà ce qui semble se passer en python : ```python sys.stdout.write("un ") # les caractères sont imprimés sur la sortie standard # un sys.stdout.write("deux ") # les caractères sont imprimés sur la sortie standard # deux sys.stdout.write("trois ") # les caractères sont imprimés sur la sortie standard # trois sys.stdout.write("\n") # le caractère EOL est imprimé sur la sortie standard # # ``` Et voilà ce qui semble se passer en python3 : ```python sys.stdout.write("un ") # les caractères sont imprimés dans un buffer sys.stdout.write("deux ") # les caractères sont imprimés dans un buffer sys.stdout.write("trois ") # les caractères sont imprimés dans un buffer sys.stdout.write("\n") # le caractère EOL est imprimé dans un buffer, tout le buffer est imprimé sur la sortie standard # un deux trois # ``` J'obtiens le même comportement avec ``print`` en python3 : ```python print("un ", end='') # rien à l'écran print("deux ", end='') # rien à l'écran print("trois", end='') # rien à l'écran print("") # tout s'affiche # un deux trois # ``` Est-ce normal ? Comment contourner cela ? Comment imprimer un caractère sur la sortie standard sans imprimer le caractère EOL, en python3 ? Merci !

AltStyle によって変換されたページ (->オリジナル) /