2013-09-30 5 views
1

Я пытаюсь скопировать весь каталог из одного места в другое через python каждые 7 дней, чтобы по существу сделать резервную копию ...Резервное копирование/копирование всего дерева папок в пакетном или python?

Папка папки резервного копирования/дерева может быть или не существовать, поэтому ей необходимо создать папку, если она не существует, поэтому я предположил, distutils лучше подходит над shutil

Примечание что лучше для меня, чтобы использовать партии или какой-либо другой язык для указанной работы?

Следующий код:

import distutils 
distutils.dir_util.copy_tree("C:\Users\A\Desktop\Test", "C:\Users\A\Desktop\test_new", preserve_mode=1, preserve_times=1, preserve_symlinks=0, update=1, verbose=0, dry_run=0) 

Возвращает:

Traceback (most recent call last): 
    File "C:\Users\A\Desktop\test.py", line 2, in <module> 
    distutils.dir_util.copy_tree("C:\Users\A\Desktop\test", "C:\Users\A\Desktop\test2", preserve_mode=1, preserve_times=1, preserve_symlinks=0, update=1, verbose=0, dry_run=0) 
AttributeError: 'module' object has no attribute 'dir_util' 

Что я делаю неправильно?

Заранее спасибо - HYFLEX

+1

Ознакомьтесь с рецептом ActiveState [Recurse copy file] (http://code.activestate.com/recipes/577493-recurse-copy-file/). – martineau

ответ

3

для Unix/Linux, я предлагаю 'rsync'. Для окон: xcopy

+2

Есть ли причина для намеренного создания кода конкретной платформы, когда вы можете просто использовать 'distutils'? –

+0

Нет веской причины, но плохая причина - у distutils есть небольшое препятствие, чтобы прыгнуть, чтобы заставить его работать, см. Мой комментарий ниже. – kmarsh

7

Вы должны импортировать dir_util специально для доступа к его функциям:

from distutils import dir_util 

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

+0

Используя этот импорт, я все еще получил ошибку. Мне пришлось добавить и distutils импорта. См. Http://stackoverflow.com/questions/18908941/unable-to-import-distutils-dir-util-on-windows/33417555#33417555 – kmarsh

0

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

Я столкнулся с той же проблемой, что и вы, с distutils. Из того, что я могу сказать, сообщество Python использует модуль distutils, чтобы начать стандартизацию взаимодействия новых модулей с Python. Я думаю, что они все еще в гуще, хотя все, что я видел, связано с этим, кажется более сложным, не менее сложным. Надеюсь, я просто вижу все сумасшедшие, которые случаются в середине большого изменения.

Но я выяснил, как заставить его работать. Для того, чтобы использовать distutil.dir_util.copytree(),

>>> from distutils import dir_util 
>>> dir_util.copy_tree("/home/user/backing_up/temp", "/home/user/backing_up/other") 
['/home/user/backing_up/other/stuff.txt']  # Return value indicating success 

Если вы чувствуете, что это стоит, вы можете импортировать distutils.core и сделать больше, чтобы позвонить в distutils.dir_util.copy_tree().

>>> import distutils.core 
>>> distutils.dir_util.copy_tree("/home/user/backing_up/temp", "/home/user/backing_up/other") 
['/home/user/backing_up/other/stuff.txt']  # Return value indicating success 

(я знаю, я знаю, есть тонкие различия между «импортом module.submodule» и «от импорта модуля субмодуля», но это не цель этого вопроса и так долго, как вы импортируете правильно и соответствующим образом вызывать функции, это не имеет значения.)

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

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

Смежные вопросы