Проверка FTP-соединения Python

У меня есть 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-соединение, если оно истекло во время ### do some parsing ### линии?

1 ответов


отправить команду NOOP. Это не делает ничего, кроме проверки того, что соединение все еще происходит, и если вы делаете это периодически, оно может поддерживать соединение.

например:

   conn.voidcmd("NOOP")

Если есть проблема с подключением, то FTP-объект выдаст исключение. Вы можете видеть из документация что исключения, если есть ошибка:

гнездо.ошибка IOError: эти подняты гнездом связи и, скорее всего, те, которые вас интересуют.

исключение ftplib.error_reply: исключение возникает, когда неожиданный ответ, полученный от сервера.

исключение ftplib.error_temp: исключение возникает при получении кода ошибки, обозначающего временную ошибку (коды ответа в диапазоне 400-499).

исключение ftplib.error_perm: исключение возникает, когда код ошибки означает получена постоянная ошибка (коды ответов в диапазоне 500-599).

исключение ftplib.error_proto: исключение возникает, когда ответ получен от сервера, который не соответствует спецификациям ответа протокола передачи файлов, т. е. начинается с цифры в диапазоне 1-5.

поэтому вы можете использовать try-catch block для обнаружения ошибки и обработки ее соответствующим образом.

например, этот пример кода поймает 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