5

自動FTPファイル同期を行うためにftplib (および場合によってはftputil )を使用することを検討しています。現在、これをテストするサーバーがいくつかありますが、両方のサーバーとの会話が成功している間、エラー応答ごとにEOFError-sが発生します。例:間違ったユーザー/パスでログインしようとすると、すべてで530応答が返されますが、EOFErrorも発生します。正しいユーザー/パスでログインするか、ログインした後にdir()を実行しようとすると、EOFErrorは発生しません。

エラーメッセージでのみ表示されるようです。これはPythonではなくサーバーが原因である可能性が高いと強く思います。他の場所でこの問題についての言及は見つかりませんでした。ただし、サーバーのセットアップを制御することはほとんどできません。

私はアイデアを求めています:

  • そもそもエラーの原因を知っていますか?
  • サーバーサイドの場合、具体的に教えてください。それが何であるかを知るまで、私はそれについて何かをすることができるかどうかわかりません...
  • 私はこれをどのように扱うべきだと思いますか?except EOFError: pass例外を処理するたびに前に追加できると思いますが、より良い/より良いアイデアがあれば、ぜひ聞いてみてください。

ありがとう!

4

1 に答える 1

6

サーバーは、接続を終了したことを通知するために送信EOFしています。

明らかに。で処理する必要があることを除いて、これを他の切断イベントと同じように扱う必要がありますexcept EOFError

http://svn.python.org/view/python/trunk/Lib/ftplib.py?view=markupからソースを参照してください

# 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はreadline()、接続時に空白行が返された場合にのみ発生します。これは、コメントが切断イベントであることを示しています。

コメントを編集してください:

サーバーは空の行を送信しません。構成方法に応じて、readline()上記の次\nまたは\rまたはすべてまでのすべてを返します。\r\nこの場合、ファイルの終わりに達したため、読み取るものはありません。これにより空白行readline()返されますが、空白行が読み取られたことを意味するわけではありません。空白行が読み取られた場合、その行を終了した文字(またはまたは)readline()を返します。\n\r\n\r

FTPUtilを使用しても例外が発生しない場合は、FTPUtilが内部で処理するためです。

于 2011-07-25T15:34:27.260 に答える