Есть ли способ прервать работу shutil copytree в Python? - PullRequest
0 голосов
/ 17 декабря 2018

Я довольно новичок в программировании в целом.Мне нужно разработать программу, которая может копировать несколько каталогов одновременно, а также учитывать несколько типов исключений.Я наткнулся на модуль shutil, который предлагает функции copytree и ignore_patterns.Вот фрагмент моего кода, который также использует диалоговое окно wxPython Multiple Directory:

import os
import wx
import wx.lib.agw.multidirdialog as MDD
from shutil import copytree
from shutil import ignore_patterns

app = wx.App(0)
dlg = MDD.MultiDirDialog(None, title="Custom MultiDirDialog", defaultPath=os.getcwd(),  agwStyle=MDD.DD_MULTIPLE|MDD.DD_DIR_MUST_EXIST)

dest = "Destination Path"

if dlg.ShowModal() != wx.ID_OK:
    dlg.Destroy()

paths = dlg.GetPaths()

ext = ['*.tiff', '*.raw', '*.p4p', '*.hkl', '*.xlsx']

for path in enumerate(paths):
    directory = path[1].replace('Local Disk (C:)','C:')
    copytree(directory, dest, ignore=ignore_patterns(directory, *ext))

dlg.Destroy()
app.MainLoop()

Этот код хорошо работает для меня.Иногда я буду копировать данные в терабайтах.В любом случае shutil.copytree может быть прерван?Я спрашиваю об этом, потому что в первый раз, когда я запустил эту программу, я выбрал довольно большой каталог и случайно скопировал тонну файлов (Успешно!) И хотел остановить это :(. Как только я обойду это, я наконец начнув GUI! Если есть больше информации, которую я могу предоставить, пожалуйста, дайте мне знать! Заранее спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

copytree принимает copy_function в качестве параметра.Если вы передадите функцию, которая проверяет флаг, вы можете вызвать ошибку, чтобы прервать операцию.

from shutil import copytree, copy2

# set this flag to True to interrupt a copytree operation
interrupt = False


class Interrupt(Exception):
    """ interrupts the copy operation """


def interruptable_copy(*args, **kwargs):
    if interrupt:
        raise Interrupt("Interrupting copy operation")
    return copy2(*args, **kwargs)


copytree(src, dst, copy_function=interruptable_copy)
0 голосов
/ 17 декабря 2018

Вы можете запустить копию в отдельном процессе Python, используя многопроцессорный модуль.Код может выглядеть примерно так:

import time
import shutil
from multiprocessing import Process


def cp(src: str, dest: str):
    shutil.copytree(src, dest)


if __name__ == '__main__':
    proc = Process(target=cp, args=('Downloads', 'Tmp'), daemon=True)
    proc.start()
    time.sleep(3)
    proc.terminate()

В моем примере основной процесс запускает дочерний процесс, который выполняет фактическое копирование, и через 3 секунды завершает его.Также вы можете проверить, запущен ли процесс, вызвав is_alive() метод процесса.

...