Уведомления

Группа в Telegram: @pythonsu

#1 Март 8, 2013 17:31:06

lov3catch
Зарегистрирован: 2012-07-15
Сообщения: 43
Репутация: +  0  -
Профиль  

Прошу конструктивной критики и по-возможности совета.

Доброго времени суток, господа.
Есть некий код, задача которого копировать файл из пункта *А* в пункт *Б*, вместе с этим выводить в консоли progressbar виду:
(скопировано кб) / (всего кб)

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

Заранее благодарен.

import os.path
import shutil
import threading
ctrl_c = "/home/lov3catch/Lama.avi" 
ctrl_v = "/home/lov3catch/test_copy"
def copy_file(my_file, my_file_dst):
	try:
		if os.path.getsize(my_file) != os.path.getsize(os.path.join(my_file_dst, os.path.basename(my_file))): 
			shutil.copy(my_file, my_file_dst)
	except OSError as e:
		print e.strerror
		shutil.copy(my_file, my_file_dst)
def copiing():
	th = threading.Thread(name='th3', target=copy_file, kwargs={'my_file': ctrl_c, 'my_file_dst': ctrl_v})
	th.start()
def progressbar(same_def):
	same_def()
	while True:
		os.system('clear')
		print os.path.getsize(os.path.join(ctrl_v, os.path.basename(ctrl_c))),"/",os.path.getsize(ctrl_c)
		if os.path.getsize(ctrl_c) == os.path.getsize(os.path.join(ctrl_v, os.path.basename(ctrl_c))) : break
th = threading.Thread(name='th4', target=progressbar, kwargs={'same_def':copiing})
th.start()



Офлайн

#2 Март 8, 2013 17:47:50

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Прошу конструктивной критики и по-возможности совета.

Мне кажется что под вашу задачу уже написан rsync

Офлайн

#3 Март 8, 2013 17:47:57

xa4a
От:
Зарегистрирован: 2008-05-28
Сообщения: 12
Репутация: +  1  -
Профиль   Отправить e-mail  

Прошу конструктивной критики и по-возможности совета.

Код не соответствует PEP-8, в частности слишком длинные строки. Очень много операций выполняеятся в одной строке, сложно следить за ходом мысли.
Программа повалится на пустом файле
Как минимум один лишний тред. Почему progressbar() запускается в отдельном треде - не понятно
Если copy_file вывалится с исключением, то progressbar будет ждать вечно
Почему в copy_file условие выхода - совпадающий размер, тоже не понятно.

try: do_smth()
except: do_smth()
Это неправильный подход.

os.path.join(ctrl_v, os.path.basename(ctrl_c)) повторяется много раз, хотя вряд ли будет меняться в процессе работы программы -> вынести в переменную.



Офлайн

#4 Март 8, 2013 18:05:37

lov3catch
Зарегистрирован: 2012-07-15
Сообщения: 43
Репутация: +  0  -
Профиль  

Прошу конструктивной критики и по-возможности совета.

Почему progressbar() запускается в отдельном треде - не понятно
А как иным образом можно реализовать progressbar?
1й поток - копирует
2й поток - проверяет сколько скопировано



Офлайн

#5 Март 8, 2013 18:42:21

xa4a
От:
Зарегистрирован: 2008-05-28
Сообщения: 12
Репутация: +  1  -
Профиль   Отправить e-mail  

Прошу конструктивной критики и по-возможности совета.

lov3catch
А как иным образом можно реализовать progressbar?
1й поток - копирует
2й поток - проверяет сколько скопировано
А чем занимается основной поток? (из которого запущены два остальных)



Офлайн

#6 Март 9, 2013 00:35:12

lov3catch
Зарегистрирован: 2012-07-15
Сообщения: 43
Репутация: +  0  -
Профиль  

Прошу конструктивной критики и по-возможности совета.

А чем занимается основной поток? (из которого запущены два остальных)
Впринципе кроме запуска двух остальных потоков - ничем.
Я пытался запустить копирование в основном потоке, а progressbar в новом, из этого ничего нормального не получилось, так как была дикая чихарда. Вызывался сначала то один, то другой поток, например при маленьком размере файла progressbar мог и вовсе не отобразиться.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version