Форум сайта python.su
Здравствуйте Уважаемые Коллеги.
Пишу код для обхода и копирования всех структуры по 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
Офлайн
Как то по коду мне сложно судить, воспользуйтесь отладчиком что бы пошагово пройтись по выполнению кода и подглядеть что происходит в момент когда директория для сканирования должна быть игнорированна.
Connection reset by peer - типичная ошибка, которую надо принимать во внимание и быть готовым к обработке. Я подобную проблему решил функцией которая делала реконект при появлении ошибки.
Офлайн
JOHN_16
Я подобную проблему решил функцией которая делала реконект при появлении ошибки.
Офлайн