【发布时间】:2018-10-03 04:54:52
【问题描述】:
我一直在尝试解决从 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 时。
ftp.set_debuglevel(2)
ftp.retrbinary('RETR ' + filename, fhandle.write)
正在打印以下日志。
cmd 'TYPE I' put 'TYPE I\r\n' get '200 类型设置为 I。\r\n' resp '200 类型设置为 I。' cmd 'PASV' put 'PASV\r\n' get '227 进入被动模式 (64,27,160,28,133,251)。\r\n' resp '227 进入被动模式(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 打开 FFFT_BRA_PM_R_201711.txt 的 BINARY 模式数据连接。\r\n' resp '150 打开 FFFT_BRA_PM_R_201711.txt 的 BINARY 模式数据连接。'
【问题讨论】:
-
您尝试等待文件下载完成多长时间?您可以使用与您的 Python 代码在同一台机器上运行的任何 FTP 客户端下载相同的文件吗?
-
是的,我可以使用 FTP 客户端下载文件。文件下载已完成,但它从不发布任何内容。
-
抱歉您的评论含糊不清。通过您的第二句话(“文件下载完成”),您指的是 FTP 客户端还是您的 Python 代码?向我们展示 FTP 客户端的日志文件。
-
我的错!我实际上误解并给出了非常神秘的回应。当我尝试从 ftp 客户端下载文件时,即使在文件下载后处于挂起状态。虽然如果我在 shell 脚本中使用期望并设置超时,我可以下载这个文件
-
好的,所以你的问题与 Python 或 ftplib 无关。所以它在 Stack Overflow 上是题外话。考虑将其移至Super User。
标签: python download ftp freeze ftplib