Unix I/O错误(0):使用python 2.7从ftps下载文件时出错无法从ftps下载文件
嗨,我正在尝试使用Python2.7从FTPS下载文件。下面是我在这里的代码,我正在选通异常IO错误。这段代码在UNIX和Python 2.7上运行时。我在windows上试用了相同的代码,效果很好。但在unix上,它不例外地工作 没有达到我犯的错误Unix I/O错误(0):使用python 2.7从ftps下载文件时出错无法从ftps下载文件,unix,ftp,python-2.7,ftps,ftplib,Unix,Ftp,Python 2.7,Ftps,Ftplib,嗨,我正在尝试使用Python2.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_TL
#!/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,并对require代码进行更改,如Comment ftps.auth()、ftps.prot_p(),那么它工作正常,但对ftps不起作用
我没有得到错误以及探索
互联网上没有可用的信息,因为我搜索了很多,但没有解决方案
请帮忙
我在unix上使用ftpliboverftp_tls类和python2.7以下是一个线索,而不是答案。。。如果我们在答案上取得更多进展,我将稍后更新
我们也经历过这个错误。我们发现的线索是错误发生在Linux机器上,而不是Windows机器上。我们在两台机器上使用相同版本的Python(2.7.2)。这表明该问题与套接字或两个操作系统之间实现方式不同的东西有关。在python2.7的UNIX上,ftplib.py似乎无法正常工作。我不知道是否有人在python的最新版本(如python 3.2)上遇到此错误。在ftplib.py中,FTP_TLS类retrbinary和retrlines命令下具有conn.unwrap()方法。此方法无法在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()
....
及
我不知道它是否对其他功能有任何影响。在windows中对产品实施此修改之前,请进行交叉检查。它工作正常,无需更改任何内容。有关更多信息,请参阅此
def retrlines(self, cmd, callback = None):
....
....
if isinstance(conn, ssl.SSLSocket):
##conn.unwrap()
conn.close()
.....
conn.close()