2012-09-12 49 views
0

您好我正尝试使用python 2.7从FTPS下载文件。下面是我的代码在这里我正在控制普通的IO错误。虽然此代码在UNIX和Python 2.7上运行。我试着用相同的代码和它的工作正常。但在unix上,它不能像例外那样工作。I/O错误(0):使用python从ftps下载文件时出错2.7无法从FTPS下载文件

没有得到我所犯的错误。

#!/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,并要求更改代码如注释ftps.auth(),ftps.prot_p(),然后它工作正常,但FTPS不起作用。

我没有得到错误以及探索 没有信息可在网上为我搜索很多,但没有解决 请帮我使用过FTPLIB类ftp_tls和python2.7上

unix

回答

1

似乎ftplib.py在python2.7中的UNIX上无法正常工作我不知道是否有任何人在python 3.2的python letest版本上获取此错误。在FTP_TLS类下的ftplib.py中,具有conn.unwrap()方法的retrbinary和retrlines命令。此方法不关闭连接,并在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() 

我不知道是否有其他的功能的任何影响。在生产中实施此修改之前,请进行交叉检查

+0

在Windows中工作正常,无需更改任何内容。欲了解更多信息,请参阅此 http://bugs.python.org/issue4791 http://bugs.python.org/issue3826 –

0

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

我们也经历过这个错误。我们发现的线索是,错误发生在Linux机器上,而不是Windows机器上。我们在两台机器上都使用相同版本的Python(2.7.2)。这表明这个问题涉及套接字或者两个操作系统之间实现不同的东西。