Question

Je suis à la recherche en utilisant ftplib (et peut-être ftputil ) pour faire une synchronisation de fichiers FTP automatisé. J'ai deux ou trois serveurs pour tester cette contre au moment, mais, alors que je vais avoir une conversation réussie avec les deux serveurs, je reçois EOFError-s avec chaque réponse d'erreur. Par exemple: si je tente de me connecter avec un utilisateur incorrect / passe, je vais obtenir la réponse 530 avec tout ... mais je reçois aussi un EOFError; si je me connecte avec un bon utilisateur / pass ou essayer de dir () après cela, etc., je ne reçois pas EOFError.

Il semble apparaître que des messages d'erreur. Je soupçonne fortement cela peut être causé par les serveurs plutôt que python: Je ne l'ai pas trouvé aucune mention de cette question ailleurs. Cependant, j'ai très peu de contrôle sur la configuration du serveur.

Je demande des idées:

  • Savez-vous ce qui pourrait être la cause de l'erreur en premier lieu?
  • Si elle est côté serveur, pourriez-vous être plus précis? Je ne sais si je serai en mesure de faire quoi que ce soit à ce sujet jusqu'à ce que je sais ce qu'il est ...
  • Comment pensez-vous que je devrais gérer cela? Je suppose que je pourrais ajouter un except EOFError: pass avant chaque fois que je gérer une exception, mais si vous avez mieux / idées plus nettes que j'aimerais les entendre.

Merci!

Était-ce utile?

La solution

Les serveurs envoient EOF pour vous dire qu'ils ont mis fin à la connexion.

Vous devez traiter ce pas différemment que tout autre événement de déconnexion, sauf que de toute évidence vous avez besoin de le manipuler avec except EOFError.

Voir la source, de http: // svn .python.org / view / python / trunk / Lib / ftplib.py? view = balisage

# Internal: return one line from the server, stripping CRLF.
# Raise EOFError if the connection is closed
182     def getline(self):
183         line = self.file.readline()
184         if self.debugging > 1:
185             print '*get*', self.sanitize(line)
186         if not line: raise EOFError
187         if line[-2:] == CRLF: line = line[:-2]
188         elif line[-1:] in CRLF: line = line[:-1]
189         return line

EOFError ne se pose lorsque readline() sur la connexion renvoie une ligne vide, que le commentaire indique est un événement de déconnexion.

Modif re votre commentaire:

Le serveur n'envoie pas une ligne vide. retourne readline() de tout jusqu'à la prochaine \n ou \r ou \r\n ou la totalité des abouve selon la façon dont il est configuré. Dans ce cas, il n'y a rien à lire parce que la fin du fichier a été atteint. Cela provoque readline() à la ligne retour un vide, cela ne signifie pas une ligne blanche a été lu. Si une ligne blanche avait été lu, readline() retournerait le caractère qui a pris fin la ligne (ou \n \r ou \n\r).

Si vous ne recevez pas l'exception lors de l'utilisation FTPUtil, qui est parce qu'elle gère en interne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top