Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何保持FTP连接处于活动状态?_Python_Ftp_Ftputil - Fatal编程技术网

Python 如何保持FTP连接处于活动状态?

Python 如何保持FTP连接处于活动状态?,python,ftp,ftputil,Python,Ftp,Ftputil,我过去常常从FTP服务器下载一批文件。它引发了错误[code>ftputil.error.FTPIOError:[Errno 60]操作超时 如中所述 keep_alive()尝试保持与远程服务器的连接处于活动状态,以防止发生超时。此方法主要用于在上载或下载文件时保持FTPHost对象的底层FTP连接处于活动状态这需要在上载或下载过程中增加一个线程,或者从回调函数调用保持活动 我通过一个回调函数调用了keep_alive ftp_host.download(source, target, cal

我过去常常从FTP服务器下载一批文件。它引发了错误[code>ftputil.error.FTPIOError:[Errno 60]操作超时

如中所述

keep_alive()
尝试保持与远程服务器的连接处于活动状态,以防止发生超时。此方法主要用于在上载或下载文件时保持FTPHost对象的底层FTP连接处于活动状态这需要在上载或下载过程中增加一个线程,或者从
回调
函数调用
保持活动

我通过一个
回调
函数调用了
keep_alive

ftp_host.download(source, target, callback=ftp_host.keep_alive) 
但它引发了
ERROR\uuuu main\uuu keep\u alive()接受1个位置参数,但给出了2个


如何使FTP连接保持活动状态?

这不是对您问题的直接回答,但它可能有助于您自己找到特定问题的答案。此外,ftputil网站上的a可以更好地帮助调试问题。也就是说,我认为可以先询问StackOverflow,因为您事先不知道问题是否简单。:-)

由于FTP是一种有状态协议,客户端和服务器不能在给定时间发送任意命令。允许的命令和可能的回复由连接所处的状态决定。另请参见中的状态图

为了克服这个限制,ftputil在后台为每个远程文件对象创建一个新的FTP连接[1]。使用这种方法,您仍然可以发送诸如
chdir
之类的命令,或者在另一个命令仍在进行时开始下载。但是,这意味着从服务器的角度来看,来自单个
FTPHost
对象的所有这些FTP连接都是独立的连接,因此每个连接都可以在不同的时间超时,具体取决于各自连接的使用模式

例如,可能存在这样的情况:当用于下载的连接仍然可用时,
FTPHost
对象启动的主连接超时

在您的情况下,找出哪些底层连接正在超时(初始连接或远程文件的连接)可能会有所帮助。您可以使用
ftputil.session.session\u工厂
创建启用FTP调试的工厂(请参阅)

不幸的是,60秒的超时时间很短,因此超时的机会相对较多

特别是考虑到FTP连接中可能出现超时,我的建议是编写FTP传输软件,以便您可以重新启动因超时而中断的操作(最好是使用新的
FTPHost
对象以增强健壮性)。到目前为止,我还没能想出一个方法来普遍解决超时问题。在简单的情况下,直接使用
ftplib
可能会更好,尽管ftputil具有
ftplib
所没有的健壮性和延迟改进。使用
ftplib
不会使您免于超时,但至少您没有任何可能使调试更加困难的“隐藏”连接


[1] 也就是说,如果您关闭ftputil中的远程文件,则可以重用底层FTP连接,除非它没有超时。库在重新使用连接之前检查超时


通过ftputil缓存来自服务器的大量信息以减少延迟,有关超时的情况更加复杂。例如,如果调用
FTPHost.getcwd()
,则当前目录将从缓存的属性中检索,而不是通过向服务器发送
PWD
命令来重置超时。目录列表中的统计信息通常也会被缓存。

您可能需要将ftp_host.keep_alive封装在一个lambda中,该lambda只使用一个参数调用它。另一条注释说,当您将函数传递给
ftp_host.download
的回调时,它会使用
chunks
参数调用,但是
ftp\u host.keep\u alive
函数不接受任何参数,因此执行此操作的一种方法是
callback=lambda chunks:ftp\u host.keep\u alive
。从docs“回调,如果给定,将为每个传输的数据块调用:
callback(chunk)
”@python\u user oops,它引发了
ftplib.error\u temp:421无传输超时(60秒):关闭控制连接
。遗憾的是,我没有想法,我以前没有使用过库