0

こんにちは私はPython2.7を使用してFTPSからファイルをダウンロードしようとしています。以下は私のコードですここで私は例外的なIOエラーをゲーティングしています。このコードがUNIXおよびPython2.7で実行されている間。私は同じコードでWindowsを試してみましたが、正常に動作しています。しかし、UNIXでは例外として機能しません。

私が間違っているところがわからない。

#!/usr/bin/env python

import ftplib  
import os
import datetime
import sys
from ftplib import FTP_TLS

try:
  ftps = FTP_TLS(server)
  ftps.debug(3)
  ftps.connect(host=server,port=portno)
  ftps.auth()    
  ftps.login(username, password)
  ftps.prot_p()    
  ftplogin=True
except Exception, e:
    logger.error(e)

# Change to the proper directory
if ftplogin:
    try:
      ftps.cwd(directory)
      filelist = [] #to store all files
      ftps.retrlines('LIST',filelist.append)    # append to list
      is_file_exist=False       
      if len(filelist)>0 :#do something                   
          is_file_exist = True

      if  is_file_exist :
         print "file exist"
          ##Loop through matching files and download each one individually
          try:
              for filename in ftps.nlst(filematch):
                  local_filename = os.path.join(downloadpath, filename)
                  fhandle = open(local_filename, 'wb')                    
                  logger.info('Getting ' + filename)
                  ftps.retrbinary('RETR ' + filename, fhandle.write)
                  fhandle.close()             #                    
              ftps.quit()    
              logger.info("File download successfull")
          except Exception , e:
              print e
              logger.error(e)
     else :
       logger.info("There is no file for processing")  

 except IOError as eo:
    print "I/O error ({0}):{1}".format(eo.errno,eo.strerror)
 except Exception, e:
   directoryFound=False
   logger.error(e)
   print e
 except :
   print "Unexpected erro:", sys.exc_info()[0]

注:ここでコードをコピーし、.Pyファイルで適切にフォーマットされているため、インデントは無視してください。

以下のエラーでコードが壊れています

Abc.txt*
Abc1.txt*
*get* '220 208.235.248.3 FTP server ready\r\n'
*resp* '220 208.235.248.3 FTP server ready'
*cmd* 'AUTH TLS'
*put* 'AUTH TLS\r\n'
*get* '234 AUTH TLS successful\r\n'
*resp* '234 AUTH TLS successful'
*cmd* 'USER Username'
*put* 'USER Username \r\n'
*get* '331 Password required for Username.\r\n'
*resp* '331 Password required for Username.'
*cmd* 'PASS ********'
*put* 'PASS ********\r\n'
*get* '230 User Username logged in.\r\n'
*resp* '230 User Username logged in.'
*cmd* 'PBSZ 0'
*put* 'PBSZ 0\r\n'
*get* '200 PBSZ 0 successful\r\n'
*resp* '200 PBSZ 0 successful'
*cmd* 'PROT P'
*put* 'PROT P\r\n'
*get* '200 Protection set to Private\r\n'
*resp* '200 Protection set to Private'
2012-09-12 05:01:54,029 - __main__ - INFO - Server login successful
changeing directory
*cmd* 'CWD /prod/hm'
*put* 'CWD /prod/hm\r\n'
*get* '250 CWD command successful.\r\n'
*resp* '250 CWD command successful.'
Directory changed/prod/hm
filelist init
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A\r\n'
*resp* '200 Type set to A'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (208,235,248,3,232,171).\r\n'
*resp* '227 Entering Passive Mode (208,235,248,3,232,171).'
*cmd* 'NLST'
*put* 'NLST\r\n'
*get* '150 Opening ASCII mode data connection for file list\r\n'
*resp* '150 Opening ASCII mode data connection for file list'
*retr* 'Abc.txt\r\n'
*retr* 'Abc1.txt\r\n'
*retr* ''
I/O error (0):Error

セキュリティのためにファイル名とFTPSの詳細を変更しました。:)

たくさんのオプションを試してみましたが、回避策はありません。これをFTPで変更し、コメントftps.auth()、ftps.prot_p()などのコード変更を要求すると、正常に機能しますが、FTPSでは機能しません。

探索するのにもエラーが発生しません。たくさん検索しているのでインターネット上に利用できる情報はありませんが、解決策はありません。助けてください</ p>

私はftp_tlsクラスでftplibを使用し、UNIXでpython2.7を使用しています

4

2 に答える 2

1

ftplib.pyがpython2.7のUNIXで正しく機能していないようです。python3.2のようなlesetバージョンのpythonでこのエラーが発生するかどうかはわかりません。FTP_TLSクラスのftplib.pyで、conn.unwrap()メソッドを持つretrbinaryおよびretrlinesコマンド。このメソッドは接続を閉じず、UNIXで正しく再開しません。conn.close()を使用できる場合は、conn.unwrap()の代わりに機能します。ftplib.py内で以下の変更を行ってください

 def retrbinary(self, cmd, callback, blocksize=8192, rest=None):
     ...
     ...
      if isinstance(conn, ssl.SSLSocket):
         ##conn.unwrap()
         conn.close()
     ....

 def retrlines(self, cmd, callback = None):
     ....
     ....
         if isinstance(conn, ssl.SSLSocket):
         ##conn.unwrap()
         conn.close()
     .....
         conn.close()

それが他の機能に影響を与えるかどうかはわかりません。この変更を本番環境に実装する前に、クロスチェックしてください

于 2012-10-12T12:30:11.307 に答える
0

以下は手がかりであり、答えではありません...答えがさらに進んだら、後で更新します。

このエラーも発生しました。私たちが見つけた手がかりは、エラーはLinuxマシンでは発生しますが、Windowsマシンでは発生しないということです。両方のマシンで同じバージョンのPython(2.7.2)を使用しています。これは、問題が2つのOS間で異なる方法で実装されているソケットまたは何かに関連していることを示唆しています。

于 2012-09-24T13:49:29.680 に答える