GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi stdbuf n'a aucun effet sur Python ?

Par défaut, le print() de Python la fonction dirige sa sortie vers sys.stdout , dont la documentation précise ceci :

Lorsqu'il est interactif, stdout et stderr les flux sont mis en mémoire tampon en ligne. Sinon, ils sont mis en mémoire tampon comme des fichiers texte normaux. Vous pouvez remplacer cette valeur par le -u option de ligne de commande.

Notez bien que ces docs ne laissent pas de place aux influences environnementales générales, comme celle du stdbuf commande, sur le mode tampon de sys.stdout :il n'est pas tamponné si le -u l'option a été utilisée (ou, de manière équivalente, si la variable d'environnement PYTHONUNBUFFERED a été défini), sinon tamponné en ligne s'il est interactif et tamponné en bloc s'il n'est pas interactif.

Les programmes peuvent contrôler leur propre mise en mémoire tampon, comme les docs de stdbuf accuser réception :

REMARQUE :Si COMMAND ajuste la mise en mémoire tampon de ses flux standard ('tee' le fait par exemple), cela remplacera les paramètres correspondants modifiés par 'stdbuf'. De plus, certains filtres (comme 'dd' et 'cat' etc.) n'utilisent pas de flux pour les E/S, et ne sont donc pas affectés par les paramètres 'stdbuf'.

Étant donné que Python spécifie explicitement les détails de la mise en mémoire tampon, il est raisonnable de s'attendre à ce qu'il gère en fait sa mise en mémoire tampon de manière affirmative, annulant ainsi tout effet de stdbuf .


Linux
  1. La sortie de Ls a des retours à la ligne mais s'affiche sur une seule ligne. Pourquoi?

  2. Qu'advient-il de la sortie d'un processus qui a été désavoué et a perdu son terminal ?

  3. Df Vs. Du:Pourquoi tant de différence ??

  4. Linux – Suid n'a aucun effet sur les répertoires avec Linux ?

  5. Dans `while Ifs=Read..`, Pourquoi Ifs n'a-t-il aucun effet ?

Instruction Python if..else

Pourquoi y a-t-il une sortie de Ping après qu'il a été terminé ?

Lors de l'utilisation de os.execlp, pourquoi `python` a besoin de `python` comme argv [0]

Pourquoi mon initrd n'a-t-il qu'un seul répertoire, à savoir "kernel" ?

Pourquoi mon montage lié est-il visible en dehors de son espace de noms de montage ?

Pourquoi mon invité linux hyper-v n'affiche-t-il pas son adresse IP dans le gestionnaire hyper-v