2013-03-02 2 views
7

У меня есть FTP-соединение, из которого я загружаю много файлов и обрабатываю их между ними. Я хотел бы иметь возможность проверить, что мое FTP-соединение не синхронизировано между ними. Таким образом, код выглядит примерно так:Проверка FTP-соединения Python

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 ### линии?

ответ

17

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

Например:

conn.voidcmd("NOOP") 

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

socket.error и IOError:. Они поднимаются на сокет-соединение и, скорее всего, те, что вы заинтересованы в

exception 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 
+0

'ftplib', кажется, не подходит принцип Pythonic, что должен быть один очевидный способ сделать что-то - или, по крайней мере, вы должны были бы дать мне это на 'voidcmd ('NOOP')' – Axeman

Смежные вопросы