Найти - Пользователи
Полная версия: Прошу конструктивной критики и по-возможности совета.
Начало » Python для новичков » Прошу конструктивной критики и по-возможности совета.
1
lov3catch
Доброго времени суток, господа.
Есть некий код, задача которого копировать файл из пункта *А* в пункт *Б*, вместе с этим выводить в консоли 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()
Singularity
Мне кажется что под вашу задачу уже написан rsync
xa4a
Код не соответствует PEP-8, в частности слишком длинные строки. Очень много операций выполняеятся в одной строке, сложно следить за ходом мысли.
Программа повалится на пустом файле
Как минимум один лишний тред. Почему progressbar() запускается в отдельном треде - не понятно
Если copy_file вывалится с исключением, то progressbar будет ждать вечно
Почему в copy_file условие выхода - совпадающий размер, тоже не понятно.

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

os.path.join(ctrl_v, os.path.basename(ctrl_c)) повторяется много раз, хотя вряд ли будет меняться в процессе работы программы -> вынести в переменную.
lov3catch
Почему progressbar() запускается в отдельном треде - не понятно
А как иным образом можно реализовать progressbar?
1й поток - копирует
2й поток - проверяет сколько скопировано
xa4a
lov3catch
А как иным образом можно реализовать progressbar?
1й поток - копирует
2й поток - проверяет сколько скопировано
А чем занимается основной поток? (из которого запущены два остальных)
lov3catch
А чем занимается основной поток? (из которого запущены два остальных)
Впринципе кроме запуска двух остальных потоков - ничем.
Я пытался запустить копирование в основном потоке, а progressbar в новом, из этого ничего нормального не получилось, так как была дикая чихарда. Вызывался сначала то один, то другой поток, например при маленьком размере файла progressbar мог и вовсе не отобразиться.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB