2015-10-21 2 views
0

У меня есть сценарий (ниже), который выталкивает html-файл на сервер. Он РАБОТАЕТ 95% времени. Однако, около 5% времени, сервер терпит неудачу, и попытка подключения зависает. Он останавливается на 15 минут (900 секунд), а затем терпит неудачу.Обработка ошибок Python для FTP hang/421 timeout

ftp = FTP('[FTP ADDRESS HERE]') 
    ftp.login('[USERNAME]','[PASSWORD]') 
    converted_HTML_string = io.BytesIO(HTML_string) 
    ftp.storbinary('STOR public_html/home.html', converted_HTML_string) 

Опять же, это работает в 95% случаев. В 5%, если это не так, если я вручную прерываю его, когда он зависает, и просто повторно запускает запрос еще раз - тогда он работает. Кажется, это вызвано временными сбоями сервера. Я не контролирую качество сервера.

Настоящая проблема в том, что повесить слишком долго. То, что я хочу, чтобы установить ограничение по времени (например, 30 секунд) на то, как долго он зависает, а затем иметь код, который говорит: «Повторно запустите эту команду ftp, пока она не удастся».

Возможно ли это? Есть ли другой способ справиться с этим?

Спасибо!

ответ

1

Таймаут канала установлен на ftp-сервере. Некоторые интерфейсы (например, FileZilla) позволяют вам настроить таймаут вашего канала. К счастью, FTP-пакет Python является одним из них. Дополнительную информацию см. На странице documentation. В то же время, попробуйте параметр тайм-аута:

ftp = FTP('[FTP ADDRESS HERE]', timeout=30) 

Максим Лотт (ОП) был в состоянии поймать ошибку тайм-аута с нижеследующим, который снова пытается соединение, пока он работает:

import socket 
except socket.timeout, e: 
+0

Спасибо. В случае, если это помогает кому-то еще, я смог уловить ошибку таймаута следующим образом, что позволяет мне повторно подключиться к подключению до тех пор, пока оно не будет работать: –

+0

import socket [paragraph здесь] кроме socket.timeout, e: –

+0

I ' m добавляя ваше объяснение к этому ответу, чтобы придать ему большую видимость. – Prune

1

Эта ошибка заставила меня задуматься.

я сделал исключение в бесконечном цикле в то время как Истинного

  • так, когда это происходит, это все еще истинно

  • тогда я называю функцию ftp_connect_to_site(), который находится внутри класса с именем RemoteTar

Эта функция будет повторно подключаться к вам, если это исключение произойдет Не лучшая идея.

новичок в Python, что все, что я мог думать о

  except ftplib.error_temp as e: 
       print('Time run out reconnect: ',e) 
       RemoteTar.ftp_connect_to_site()  
Смежные вопросы