6

一般来说,我对编程很陌生。我需要开发一个可以一次复制多个目录并考虑到多个文件类型异常的程序。我遇到了提供 copytree 和 ignore_patterns 功能的 shutil 模块。这是我的代码片段,它也使用 wxPython 多目录对话框:

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()

这段代码对我很有效。有时,我会复制数 TB 的数据。无论如何都可以中断 shutil.copytree 吗?我问这个,因为我第一次运行这个程序时,我选择了一个相当大的目录并意外复制了大量文件(成功!)并想停止它:(。一旦我解决了这个问题,我终于开始了在 GUI 上!如果我可以提供更多信息,请告诉我!提前感谢所有帮助!

4

2 回答 2

2

您可以使用多处理模块在单独的 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()方法来检查进程是否正在运行。

于 2018-12-17T13:43:51.470 回答
1

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)
于 2018-12-25T15:46:16.663 回答