I / O错误(0):使用python 2.7从ftps下载文件时出错无法从FTPS下载文件

时间:2012-09-12 09:17:56

标签: unix ftp python-2.7 ftps ftplib

HI我正在尝试使用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改变这个男女同校并且需要修改代码如ftps.auth(),ftps.prot_p(),那么它工作正常但FTPS无法正常工作。

我也没有得到错误以便探索 在我搜索很多但没有解决方案时,互联网上没有可用的信息 请帮忙

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

2 个答案:

答案 0 :(得分:1)

似乎ftplib.py在python2.7上的UNIX上运行不正常我不知道是否有任何人在python 3.2的python版本上获得此错误。在ftplib.py下的FTP_TLS类retrbinary和retrlines命令下有conn.unwrap()方法。此方法不关闭连接并在unix上正确重新打开。而不是conn.unwrap()如果我们可以使用conn.close()它将工作。 请在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()

我不知道它是否对其他功能有任何影响。请在生产

上实施此修改之前进行交叉检查

答案 1 :(得分:0)

以下是线索,而不是答案......如果我们在答案上取得更多进展,我会稍后更新。

我们也遇到过这个错误。我们发现的线索是错误发生在Linux机器上,而不是Windows机器上。我们在两台机器上使用相同版本的Python(2.7.2)。这表明该问题与套接字或在两个操作系统之间以不同方式实现的内容有关。