【发布时间】:2013-04-04 20:09:19
【问题描述】:
我编写了一些代码来登录到一个 AS/400 FTP 站点,移动到某个目录,并找到我需要下载的文件。它可以工作,但似乎当我收到很多要下载的文件时:
socket.error: [Errno 10054] An existing connection was
forcibly closed by the remote host
我成功登录并导航到相应的目录:
try:
newSession = ftplib.FTP(URL,username,password)
newSession.set_debuglevel(3)
newSession.cwd("SOME DIRECTORY")
except ftplib.all_errors, e:
print str(e).split(None,1)
sys.exit(0)
我获取我需要的文件列表:
filesToDownload= filter(lambda x: "SOME_FILE_PREFIX" in x, newSession.nlst())
这就是它正在死去的地方(特别是newSession.retrbinary('RETR '+f,tempFileVar.write)):
for f in filesToDownload:
newLocalFileName = f + ".edi"
newLocalFilePath = os.path.join(directory,newLocalFileName)
tempFileVar = open(newLocalFilePath,'wb')
newSession.retrbinary('RETR '+f,tempFileVar.write)
tempFileVar.close()
在我遇到Errno 10054 之前,它会下载我需要的 85% 以上的文件,我想我只是对为什么它在接近完成时似乎任意死感到困惑。我现在诚实的猜测是尝试提取这些文件时对 FTP 的请求太多。
这是我的命令提示符上出现的错误截图:
任何建议或指示都会很棒。我仍在尝试解决此问题。
【问题讨论】:
-
@JaneT:Python
ftplib模块的级别低于典型的 FTP 客户端软件,因此没有任何mget。 -
可以选择第三方软件吗?我发现使用 WinSCP 之类的脚本编写 FTP 比直接在 Python 中编写脚本更容易。实际上,我仍然使用 Python 来生成 WinSCP 脚本,在这些脚本上调用 WinSCP,并在本地处理文件。当你的本地机器是 Windows 时,Python 和 WinSCP 是一个很好的组合(我可以从你的回溯中看到它)。
-
@JaneT 很遗憾,我无法访问 AS/400 上的作业日志。它在客户端,即使我提出请求,周转速度也会很慢。
-
@JohnY 老实说,我不想将第三方软件视为一种选择。我们正在从中迁移数据处理工具的服务器上有一个(过时的)Perl 脚本,它工作半成功,正如我在帖子中提到的那样,它确实有效,但无法处理大量下载,这令人沮丧。
-
我提到 WinSCP 是因为它是免费的(包括源代码)并且非常强大。如果您只是遇到较大工作的问题,您是否可以将您的请求分成更小的块(单独的会话)?就像在任何给定会话中最多只能抓取 n 个文件。
标签: python python-2.7 ftp ibm-midrange ftplib