web-dev-qa-db-fra.com

À quelle fréquence python est-il vidé dans un fichier?

  1. À quelle fréquence Python est-il vidé dans un fichier?
  2. À quelle fréquence Python se vide-t-il sur la sortie standard?

Je ne suis pas sûr de (1).

En ce qui concerne (2), je crois que Python est vidée de la sortie standard après chaque nouvelle ligne. Mais si vous surchargez stdout pour être dans un fichier, est-ce qu'il videra aussi souvent?

198
Tim McJilton

Pour les opérations sur les fichiers, Python utilise la mise en mémoire tampon par défaut du système d'exploitation, à moins que vous ne le configuriez autrement. Vous pouvez spécifier une taille de tampon, non tamponnée ou tamponnée en ligne.

Par exemple, la fonction open utilise un argument de taille de tampon.

http://docs.python.org/library/functions.html#open

"L’argument buffering optionnel spécifie la taille de tampon souhaitée pour le fichier:"

  • 0 signifie non tamponné,
  • 1 signifie ligne tamponnée,
  • toute autre valeur positive signifie que vous utilisez un tampon de (approximativement) cette taille.
  • Une mise en mémoire tampon négative signifie l'utilisation de la valeur par défaut du système, qui est généralement une ligne mise en mémoire tampon pour les périphériques tty et entièrement en mémoire tampon pour les autres fichiers.
  • Si omis, la valeur par défaut du système est utilisée.

code:

bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
295
Corey Goldberg

Vous pouvez également forcer le vidage de la mémoire tampon dans un fichier par programme avec la méthode flush() .

with open('out.log', 'w+') as f:
    f.write('output is ')
    # some work
    s = 'OK.'
    f.write(s)
    f.write('\n')
    f.flush()
    # some other work
    f.write('done\n')
    f.flush()

J'ai trouvé cela utile lorsque vous réduisez un fichier de sortie avec tail -f.

156
kortina

Je ne sais pas si cela s'applique également à python, mais je pense que cela dépend du système d'exploitation que vous utilisez.

Sous Linux, par exemple, output to terminal vide le tampon sur une nouvelle ligne, tandis que pour une sortie sur des fichiers, il ne vide que lorsque le tampon est plein (par défaut). En effet, il est plus efficace de vider le tampon moins de fois et l'utilisateur est moins susceptible de remarquer si la sortie n'est pas vidée sur une nouvelle ligne d'un fichier.

Vous pourrez peut-être vider automatiquement la sortie si c'est ce dont vous avez besoin.

EDIT: Je pense que vous rinceriez automatiquement dans python de cette façon (d'après ici )

#0 means there is no buffer, so all output
#will be auto-flushed
fsock = open('out.log', 'w', 0)
sys.stdout = fsock
#do whatever
fsock.close()
13
KLee1

Vous pouvez également vérifier la taille de la mémoire tampon par défaut en appelant l'attribut DEFAULT_BUFFER_SIZE en lecture seule à partir du module io.

import io
print (io.DEFAULT_BUFFER_SIZE)
12
N Randhawa

Voici une autre approche, à vous de choisir celle qu’il préfère.

Lorsque vous insérez le code ci-dessous dans le fichier __init__. Py avant tout autre code, les messages imprimés avec print et les erreurs éventuelles ne seront plus consignés dans le fichier Log.txt d'Ableton, mais dans des fichiers séparés sur votre disque:

import sys

path = "/Users/#username#"

errorLog = open(path + "/stderr.txt", "w", 1)
errorLog.write("---Starting Error Log---\n")
sys.stderr = errorLog
stdoutLog = open(path + "/stdout.txt", "w", 1)
stdoutLog.write("---Starting Standard Out Log---\n")
sys.stdout = stdoutLog

(pour Mac, remplacez #username# par le nom de votre dossier d'utilisateur. Sous Windows, le chemin d'accès à votre dossier d'utilisateur aura un format différent.)

Lorsque vous ouvrez les fichiers dans un éditeur de texte qui actualise son contenu lorsque le fichier sur le disque est modifié (exemple pour Mac: TextEdit ne le fait pas, mais TextWrangler le fait), les journaux sont mis à jour en temps réel.

Crédits: ce code a été copié principalement à partir des scripts de la surface de contrôle liveAPI de Nathan Ramella

1
Mattijs