0

您好我正在尝试使用 python 2.7 从 FTPS 下载文件。下面是我的代码这里我正在门控正常的 IO 错误。虽然此代码在 UNIX 和 Python 2.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 更改此 coed 并进行需要代码更改,例如 Comment ftps.auth()、ftps.prot_p(),那么它可以正常工作,但 FTPS 无法正常工作。

我也没有得到错误来探索互联网上没有可用的信息,因为我搜索了很多但没有解决方案请帮助</p>

我在 ftp_tls 类上使用 ftplib,在 unix 上使用 python2.7

4

2 回答 2

1

它似乎 ftplib.py 在 python2.7 中的 UNIX 上无法正常工作我不知道是否有人在像 python 3.2 这样的 python 的最小版本上得到这个错误。在具有 conn.unwrap() 方法的 FTP_TLS 类 retrbinary 和 retrlines 命令下的 ftplib.py 中。此方法不会关闭连接并在 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)。这表明该问题与套接字或在两个操作系统之间以不同方式实现的事物有关。

于 2012-09-24T13:49:29.680 回答