Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 13, 2012 06:12:49

erl
Зарегистрирован: 2011-01-30
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

ftputil и обход директорий

Здравствуйте Уважаемые Коллеги.

Пишу код для обхода и копирования всех структуры по FTP (active ftp connection). Код рабочий (был), но вот почему то, при обходе очередной директории которую скачивать не нужно и она исключена из списка закачки, начинаются тормоза(т.е. в директории почему то опрашиваеться фалы но с качиваються хотя должна йстключаться вся директория) ни как не могу разобраться в чем причина. т.е. все равно идет обращение к этой директории и попытка проверить все файлы в ней, хотя нужно просто ее игнорировать и переходить к следующей. В окончании всей этой вакханалии удаленная сторона разрывает соединение с причиной Connection reset by peer (от начала опроса директории до разрыва соединения проходит порядка 6 часов).
В чем причина подскажите, понимаю что написал что то не то, но вот что не пойму, не хватает опыта, помогите пожалуйста.

# class ftp
class AddedLevel(ftplib.FTP):
    def __init__(self, host, userid, password, port):
        """Act like ftplib.FTP's constructor but use active mode explicitly."""
        ftplib.FTP.__init__(self)
        if int(option['ftp_timeout']) != 0:
            #print "Timeout: " + str(int(option['ftp_timeout']) * 60)
            self.connect(host, port, (int(option['ftp_timeout']) * 60))
        else:
            self.connect(host, port)
        self.login(userid, password)
        self.set_pasv(option['ftp_mode'])
        if int(option['debug_ftp_level']) >= 0 and int(option['debug_ftp_level']) <= 2:
            self.set_debuglevel(int(option['debug_ftp_level']))
        else:
            self.set_debuglevel(0)
# procedure save log file
def save_log(log_string):
    """ Save to log file """
    print str(datetime.datetime.now()) + " " + log_string
    sys.stdout.flush()
# procedure load_file
def load_files(arg, dirs, files):
    """ Loading files from remote FTP server """
    directory_bool_except = False
    for directory_one in except_file:
        if dirs.find(directory_one) != -1:
            directory_bool_except = True
    if not dirs in except_file and not directory_bool_except:
        # loading files
        for file_one in files:
            if dirs[:-1] == "/":
                name_file_load = (dirs + file_one).replace("//","/")
            else:
                name_file_load = (dirs + "/" + file_one).replace("//","/")
            if not os.path.exists(path_bkp_local + "/" + dirs):
                os.makedirs(path_bkp_local + "/" + dirs)
            if FTPCon.path.isfile(name_file_load):
                # check size file
                FTP_file_size = FTPCon.stat(name_file_load)[6]
                #print "size file:" + str(FTP_file_size)
                try:
                    # loading file from ftp server
                    FTPCon.download(name_file_load, path_bkp_local + "/" + name_file_load, "b")
                except Exception, loading_except:
                    save_log("[DOWNLOAD FILES] File " + name_file_load + " upload not correct")
                    save_log("[DOWNLOAD FILES] ERROR: " + str(loading_except))
                    save_log("[TYPE EXCEPTION] " + str(sys.exc_info()[0]))
                    save_log("[EXCEPTION] " + str(sys.exc_info()[1]))
                    traceback.print_exc()
                    if os.path.isfile(path_bkp_local + "/" + name_file_load):
                        os.unlink(path_bkp_local + "/" + name_file_load)
                else:
                    # check size file after loading
                    if FTP_file_size != os.stat(path_bkp_local + "/" + name_file_load)[6]:
                        # delete file
                        save_log("file " + name_file_load + " upload not correct, size file not equal after upload,file is deleted")
                        os.unlink(path_bkp_local + "/" + name_file_load)
                    else:
                        #save_log("File " + name_file_load + " upload SUCCESSFUL")
                        pass
            elif FTPCon.path.isdir(name_file_load):
                if not os.path.exists(path_bkp_local + "/" + name_file_load):
                    os.makedirs(path_bkp_local + "/" + name_file_load)
# main program
# /с - это такие виртуальные директории сделаны на удаленной стороне
option = {"load_directory":"/c,/d","ftp_host":"192.168.1.2","ftp_user":"user","ftp_password":"passwd","ftp_port":"21","ftp_timeout":"3","ftp_mode":"True"."debug_ftp_level":"2"}
FTPCon = ftputil.FTPHost(option['ftp_host'], option['ftp_user'], option['ftp_password'], option['ftp_port'],session_factory=AddedLevel)
FTPCon.set_directory_format(option['directory_format'])
for disk_one in option['load_directory'].split(","):
    if FTPCon.path.exists(disk_one + "/"):
         FTPCon.chdir(disk_one + "/")
         save_log ("Begin load: " + disk_one + "/")
         FTPCon.path.walk(disk_one + "/", load_files, [])
    else:
         continue



Офлайн

#2 Сен. 13, 2012 07:44:15

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

ftputil и обход директорий

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

Connection reset by peer - типичная ошибка, которую надо принимать во внимание и быть готовым к обработке. Я подобную проблему решил функцией которая делала реконект при появлении ошибки.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 13, 2012 08:14:45

erl
Зарегистрирован: 2011-01-30
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

ftputil и обход директорий

JOHN_16
Я подобную проблему решил функцией которая делала реконект при появлении ошибки.

Это понятно.
Не понятно почему скачивание идет по 6 часов. При ручном скачивании больше часа не получается.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version