Проверка допустимости ftp-соединения с помощью команды noop

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

def connect_ftp(ftp):
    print "ftp1"
    starttime = time.time()
    retry = False
    try:
        ftp.voidcmd("NOOP")
        print "ftp2"
    except:
        retry = True
        print "ftp3"
    print "ftp4"
    while (retry):
        try:
            print "ftp5"
            ftp.connect()
            ftp.login('LOGIN', 'CENSORED')
            print "ftp6"
            retry = False
            print "ftp7"
        except IOError as e:
            print "ftp8"
            retry = True
            sys.stdout.write("\rTime disconnected - "+str(time.time()-starttime))
            sys.stdout.flush()
            print "ftp9"

Я вызываю функцию, используя только:

ftp = ftplib.FTP('CENSORED')
connect_ftp(ftp)

Тем не менее, я проследил, как выполняется код, используя строки print, и при первом использовании модуля (еще до подключения FTP) мой сценарий запускает ftp.voidcmd («NOOP») и не исключает его, так что нет сначала делается попытка подключиться к FTP.

Результат:

ftp1
ftp2
ftp4
ftp success #this is ran after the module is called

Я признаю, что мой код не самый лучший и не самый красивый, и я еще ничего не реализовал, чтобы убедиться, что я не подключаюсь постоянно, если мне все равно не удается переподключиться, но я не могу понять, почему это не работает для жизнь меня так что я пока не вижу смысла расширять модуль. Это даже лучший подход для подключения / повторного подключения к FTP?

заранее спасибо

Я изменил вопрос согласно запросу. Я также поменял местами .connect () и login (), как рекомендовано. @MartinPrikryl

wonk 31.10.2018 14:00

Только что-то простое, как connect_ftp (ftp) @MartinPrikryl

wonk 31.10.2018 14:31
2
2
385
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это соединяет для сервера:

ftp = ftplib.FTP('CENSORED')

Итак, естественно, команда NOOP завершается успешно, поскольку для нее не требуется аутентифицированное соединение.

Ваш connect_ftp правильный, за исключением того, что вам нужно указать имя хоста в вашем вызове connect.

Без логина?

wonk 31.10.2018 14:38

Подключение и вход в FTP - это две разные вещи. Команде NOOP не требуется аутентифицированное соединение.

Martin Prikryl 31.10.2018 14:38

Меня это серьезно поразило, я почти злюсь, как все было так просто. Извините за зря потраченное время, приятель.

wonk 31.10.2018 14:41

Другие вопросы по теме