我一直在尝试解决一个问题,当我们从ftp/ftps下载文件时。未成功执行下载文件后操作。没有出现可以提供有关该问题的更多信息的错误。
我试图在stackoverflow上搜索这个,发现了这个link,它讨论了类似的问题语句,看起来我也面临着类似的问题,尽管我不确定。在解决这个问题上不需要更多的帮助。在
我试着将FTP连接超时设置为60分钟,但效果不太理想。
在此之前,我使用的是ftplib的retrbinary(),但也出现了同样的问题。我试着通过不同的块大小和窗口大小,但同样的问题是可重复的。在
我正在尝试从AWS EMR集群下载大小为~3GB的文件。下面是示例代码。在def download_ftp(self, ip, port, user_name, password, file_name, target_path):
try:
os.chdir(target_path)
ftp = FTP(host=ip)
ftp.connect(port=int(port), timeout=3000)
ftp.login(user=user_name, passwd=password)
if ftp.nlst(file_name) != []:
dir = os.path.split(file_name)
ftp.cwd(dir[0])
for filename in ftp.nlst(file_name):
sock = ftp.transfercmd('RETR ' + filename)
def background():
fhandle = open(filename, 'wb')
while True:
block = sock.recv(1024 * 1024)
if not block:
break
fhandle.write(block)
sock.close()
t = threading.Thread(target=background)
t.start()
while t.is_alive():
t.join(60)
ftp.voidcmd('NOOP')
logger.info("File " + filename + " fetched successfully")
return True
else:
logger.error("File " + file_name + " is not present in FTP")
except Exception, e:
logger.error(e)
raise
在上面提到的链接中建议的另一个选项是下载小部分文件后关闭连接,然后重新启动连接。有人能建议如何实现这一点,但不确定如何从上次关闭连接前停止文件下载的同一点继续下载。这个方法是下载整个文件的充分证据。在
我对FTP服务器级超时设置了解不多,所以不知道该如何更改。我基本上想写一个通用的FTP下载器,它可以帮助从FTP/FTPS下载文件。在
当我使用ftplib的retrbinary()方法并将调试级别设置为2时。在
^{pr2}$
下面的日志正在打印。在cmd 'TYPE I'
put 'TYPE I\r\n'
get '200 Type set to I.\r\n'
resp '200 Type set to I.'
cmd 'PASV'
put 'PASV\r\n'
get '227 Entering Passive Mode (64,27,160,28,133,251).\r\n'
resp '227 Entering Passive Mode (64,27,160,28,133,251).'
cmd 'RETR FFFT_BRA_PM_R_201711.txt'
put 'RETR FFFT_BRA_PM_R_201711.txt\r\n'
get '150 Opening BINARY mode data connection for FFFT_BRA_PM_R_201711.txt.\r\n'
resp '150 Opening BINARY mode data connection for FFFT_BRA_PM_R_201711.txt.'