2011-07-25 17 views
1

自動FTPファイルの同期を行うためにftplib(おそらくftputil)を使用しています。私は現時点でこれをテストするサーバをいくつか持っていますが、両方のサーバとの会話が成功している間は、エラー応答ごとにEOFErrorを取得します。たとえば、間違ったユーザー/パスでログインしようとすると、私は530レスポンスをすべて取得しますが、EOFErrorも取得します。私が正しいユーザーでログインしていたり​​、パスしたり、そうした後にdir()しようとすると、私はEOFErrorを取得しません。ftplibを使用しているときに例外を伴うEOFErrorを取得する

エラーメッセージが表示されているようです。私はこれが、Pythonではなくサーバーによって引き起こされている可能性が高いと強く思っています。私はこの問題について他のところで言及していません。しかし、私はサーバーの設定をほとんど制御していません。

私はアイデアを求めている:あなたは、最初の場所でエラーの原因となることができるもの

  • 知っていますか?
  • サーバー側であれば、より具体的にできますか?私はそれが何であるかを知るまで私が何かをすることができるかどうかわかりません...
  • 私はこれをどう対処すべきだと思いますか?私は例外を処理するたびにexcept EOFError: passを追加することができたと思うが、あなたがより良い/より精巧なアイデアを持っていれば、私はそれらを聞きたい。

ありがとう!

答えて

4

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

他の切断イベントと違って、これを処理する必要がありますが、明らかにそれはexcept EOFErrorで処理する必要があります。

は、接続上の readline()コメントが切断イベントであることを示し空白行を返す場合にのみ発生し 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()は、設定されている方法によっては、\nまたは\rまたは\r\nまで、またはすべてのものを返します。この場合、ファイルの末尾に達したため、を読み取ることはありません。これにより、readline()が返信になりますが、これは空白行が読み取られたことを意味しません。空白行が読み取られた場合、readline()は、行を終了した文字(\nまたは\rまたは\n\r)を返します。

FTPUtilを使用しているときに例外が発生しない場合は、内部的に処理されるためです。

+0

私はログインでき、ディレクトリリストを取得し、ディレクトリを作成しようとしました。作成する権限がありません(また、 'error_perm'と一緒に' EOFerror'を取得します)同じ接続オブジェクトに対して 'dir()' _again_を正常に実行してください。接続を終了した場合、後者をやり直すことはできません(少なくとも再ログインする必要があります)。 – bdeniker

+1

私は接続の2つのレベルがあると思う - 各要求と応答は本質的に1つの接続ですが、制御チャネルは本質的に別の接続です。この 'EOF'はすべてのコマンドの後に起こりますが、コマンドがエラーだったときにあなたに泡立つだけです。 – agf

+0

私はそうだと思いますが、なぜサーバが例外を伴う空行を送るのかまだ分かりません。その上に、['ftputil'](http://pypi.python.org/pypi/ftputil/ 2.4.1)は 'ftplib'を使用しているように見えますが、関連する例外のみを返します... – bdeniker

関連する問題