2017-04-14 4 views
0

J'ai un extrait de code de queue-like que j'ai trouvé quelque part sur le web. Malheureusement, j'ai découvert à un moment donné, il semble être coincé sur EOF même lorsque l'EOF n'est plus là, car quelque chose a été ajouté au fichier. Il retournera toujours 0. Si je cherche en arrière, par exemple 10 octets, il lira jusqu'à la position EOF précédente et c'est tout. Je peux le réparer en fermant et en rouvrant le fichier, mais je ne comprends pas le comportement. Quelqu'un peut-il aider?python "queue -f" comme readline de la fonction coincé sur EOF

Le code:

def tail_f_nonblock(f): 
    while True: 
     where = f.tell() 
     line = f.readline() 
     if not line: 
      diff = f.tell()-where 
      f.seek(where) 
     # If there was some output, give -1 
      if diff!=0: return -1 
      else: return 0 
     else: 
      return line 
+0

ce qui est 'dire()' ici? – marmeladze

+0

Il obtient la position actuelle dans le fichier. Utilisé pour savoir s'il y avait une ligne incomplète lue, et si c'est le cas, retournez et informez l'utilisateur. –

Répondre

0

Je suppose que vous êtes sur une machine Linux ou similaire. Le numéro d'inode (utilisez ls -i filename) at-il changé lorsque le fichier a été modifié? Si oui - essentiellement votre ancien fichier a été supprimé, mais son contenu est toujours disponible via le gestionnaire de fichiers utilisé par votre programme (c'est-à-dire qu'il pointe toujours vers l'ancien inode). Dans ce cas, la réouverture est la seule possibilité.

Pour plus de détails, voir What happens to an open file handler on Linux if the pointed file gets moved, delete

+0

Merci! C'était la raison. Il est triste cependant, que sur Linux (ou est-ce une faute ext4?) La réouverture est la seule possibilité. On dirait une fonctionnalité manquante. –