Истечение времени ожидания ftplib для Python - PullRequest
10 голосов
/ 10 августа 2010

Я пытаюсь использовать ftplib для получения списка файлов и загрузки любых новых файлов со времени моей последней проверки. Код, который я пытаюсь запустить до сих пор:

#!/usr/bin/env python
from ftplib import FTP
import sys

host = 'ftp.***.com'
user = '***'
passwd = '***'

try:
    ftp = FTP(host)
    ftp.login(user, passwd)
except:
    print 'Error connecting to FTP server'
    sys.exit()

try:
    ftp.retrlines('LIST')
except:
    print 'Error fetching file listing'
    ftp.quit()
    sys.exit()

ftp.quit() 

Всякий раз, когда я запускаю это, время ожидания истекает, когда я пытаюсь получить данные о компании. Есть идеи?

Ответы [ 2 ]

12 голосов
/ 22 марта 2012

Если по какой-либо причине не работает пассивный режим, попробуйте:

ftp.set_pasv(False)

, чтобы использовать активный режим.

12 голосов
/ 10 августа 2010

Скорее всего, конфликт между активным и пассивным режимом. Убедитесь, что выполнено одно из следующих действий:

  1. Сервер поддерживает режим PASV, а ваш клиент настраивает режим PASV
  2. Если сервер не поддерживает пассивный режим, ваш брандмауэр должен поддерживать FTP-передачу в активном режиме.

РЕДАКТИРОВАТЬ: я посмотрел документы и обнаружил, что в Python 2.1 и более поздних версиях по умолчанию пассивный режим. С каким сервером вы разговариваете, и знаете ли вы, поддерживает ли он пассивный режим?

В активном режиме (не PASV) клиент отправляет команду PORT, указывающую серверу инициировать соединение DATA на этом порту, что требует, чтобы брандмауэр знал о команде PORT, чтобы он мог перенаправить входящее соединение DATA вам - немногие брандмауэры поддерживают это. В пассивном режиме клиент открывает соединение DATA, и сервер использует его (сервер «пассивен» при открытии соединения данных).

На случай, если вы не используете пассивный режим, выполните ftp.set_pasv(True) и посмотрите, будет ли это иметь значение.

...