检查Python FTP连接

13 投票
1 回答
22671 浏览
提问于 2025-04-17 17:39

我有一个FTP连接,我正在从中下载很多文件,并在这个过程中处理它们。我想检查一下我的FTP连接是否在处理过程中断开了。所以我的代码大致是这样的:

conn = FTP(host='blah')
conn.connect()
for item in list_of_items:
    myfile = open('filename', 'w')
    conn.retrbinary('stuff", myfile)
    ### do some parsing ###

我该如何检查我的FTP连接,以防在### 进行一些解析 ###这一行时连接超时了呢?

1 个回答

26

发送一个 NOOP 命令。这个命令其实什么都不做,只是用来检查连接是否还在。如果你定期发送这个命令,可以保持连接活跃。

举个例子:

   conn.voidcmd("NOOP")

如果连接出现问题,FTP 对象会抛出一个异常。你可以从文档中看到,如果出现错误就会抛出异常:

socket.error 和 IOError:这些是由 socket 连接引发的,通常是你最关心的错误。

异常 ftplib.error_reply:当从服务器收到意外的回复时会抛出这个异常。

异常 ftplib.error_temp:当收到一个表示临时错误的错误代码(响应代码在 400 到 499 之间)时会抛出这个异常。

异常 ftplib.error_perm:当收到一个表示永久错误的错误代码(响应代码在 500 到 599 之间)时会抛出这个异常。

异常 ftplib.error_proto:当从服务器收到的回复不符合文件传输协议的响应规范时会抛出这个异常,也就是说,回复的开头应该是 1 到 5 之间的数字。

因此,你可以使用try-catch 结构来检测错误并进行相应处理。

例如,下面这段代码会捕捉到 IOError,告诉你发生了什么,然后重试操作:

retry = True
while (retry):
    try:
        conn = FTP('blah')
        conn.connect()
        for item in list_of_items:
            myfile = open('filename', 'w')
            conn.retrbinary('stuff', myfile)   
            ### do some parsing ###

        retry = False

    except IOError as e:
        print "I/O error({0}): {1}".format(e.errno, e.strerror)
        print "Retrying..."
        retry = True

撰写回答