0

在 Windows 10 操作系统上使用 Python 3.8。我第一次运行 copy_tree 它运行良好,即所有文件和子目录都按预期复制。

当我从目标手动删除新复制的目录并再次运行 copy_tree 时(在删除由 copy_tree 创建的初始目标目录后 1 分钟内),它将复制除子目录之外的所有内容。请注意,这些子文件夹中没有内容。

是否存在技术上不删除已删除文件夹的时间范围?

编辑:这是我的功能:

def isFolder(path):
    return os.path.isdir(path) if os.path.exists(path) else False

def copyFolderContent(srcFolder, destFolder):
    srcFolderOK = isFolder(srcFolder)
    destFolderOK = isFolder(destFolder)

    if srcFolderOK and destFolderOK:
        return copy_tree(srcFolder, destFolder)
    else:
        return None

源目录如下所示:

SourceParentFolder
   -> ChildFolder

目标目录如下所示:

DestinationParentFolder
   (no contents)

运行 copy_tree 后,目标目录为:

DestinationParentFolder
   -> ChildFolder

然后,在手动删除“ChildFolder”并在大约一分钟内运行 copy_tree 后:

DestinationParentFolder
   (no contents)

期望将“ChildFolder”复制到 DestinationParentFolder,但除非经过大量时间,否则不会发生这种情况。

4

1 回答 1

0

我有一个非常相似,也许相同的问题。经过一些测试,问题似乎部分出在我的 IDE Spyder 上。

问题

我有两个目录/test/a/test/x. 我想将内容复制ax. 我希望尽可能多地保留元数据,并且我不希望我的脚本因现有文件而失败(就像这个问题中的情况一样),所以我正在尝试使用distutils.dir_util.copy_tree().

a包含以下文件和子目录:

+---a
    |   
    \---b
        |   testfile1.txt
        |   
        \---c
                testfile2.txt
                testfile3.txt

昨天,我用 Python 3.9.2 和 Spyder 4.2.3 创建了一个新的 anaconda 环境。

我在 Spyder 中运行了以下脚本:

from pathlib import Path
from distutils.dir_util import copy_tree

src = Path.cwd() / 'a'
dst = Path.cwd() / 'x'


copy_tree(str(src), str(dst), preserve_times=True, update=False)

我第一次运行脚本时,所有a的内容都被复制到x.

如果我删除x并重新运行脚本,x则会创建一个新脚本,a不会复制其中的内容,并且会引发以下错误:

Traceback (most recent call last):

  File "C:\Users\Joseph\computer\Anaconda3\envs\sandbox3\lib\distutils\file_util.py", line 41, in _copy_file_contents
    fdst = open(dst, 'wb')

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Joseph\\test\\x\\b\\c\\testfile2.txt'


During handling of the above exception, another exception occurred:

Traceback (most recent call last):

  File "C:\Users\Joseph\test\troubleshoot-copy_tree-0.2.py", line 14, in <module>
    copy_tree(str(src), str(dst), preserve_times=True, update=False)

  File "C:\Users\Joseph\computer\Anaconda3\envs\sandbox3\lib\distutils\dir_util.py", line 157, in copy_tree
    copy_tree(src_name, dst_name, preserve_mode,

  File "C:\Users\Joseph\computer\Anaconda3\envs\sandbox3\lib\distutils\dir_util.py", line 157, in copy_tree
    copy_tree(src_name, dst_name, preserve_mode,

  File "C:\Users\Joseph\computer\Anaconda3\envs\sandbox3\lib\distutils\dir_util.py", line 161, in copy_tree
    copy_file(src_name, dst_name, preserve_mode,

  File "C:\Users\Joseph\computer\Anaconda3\envs\sandbox3\lib\distutils\file_util.py", line 151, in copy_file
    _copy_file_contents(src, dst)

  File "C:\Users\Joseph\computer\Anaconda3\envs\sandbox3\lib\distutils\file_util.py", line 43, in _copy_file_contents
    raise DistutilsFileError(

DistutilsFileError: could not create 'C:\Users\Joseph\test\x\b\c\testfile2.txt': No such file or directory

该错误似乎是由 _copy_file_contents 引起的,它试图打开并写入一个不存在的新文件。这对我来说没有意义,因为首先那里不应该有文件。对于一个非常相似的问题,请参阅这个未回答shutil.copytree()的问题,但改为使用。

我试过的

我尝试x再次删除,然后退出 Spyder,开始一个新的 anaconda 终端会话,再次打开 Spyder,然后重新运行脚本。一切都按预期工作(x已创建,并将a的内容复制到其中)。如果我随后删除x并重新运行脚本,x则会创建并抛出相同的错误。我不知道为什么重新启动 Anaconda 提示和 Spyder 解决了第一个脚本运行的问题,但我能够多次重现这个问题。

我尝试将a我的脚本文件移动到一个新的父目录中,并且该脚本再次工作(创建x、复制所有a等)。在新位置,然后我删除x并重新运行脚本。x已创建,然后引发相同的错误。

然后我删除x,退出 Spyder,并从 Anaconda 提示符启动 IDLE。我在 IDLE 中运行脚本,它第一次工作。我删除x并重新运行脚本,它再次工作。我又做了几次,每次都有效。

为什么我的脚本可以在 IDLE 中运行,但不能在 Spyder 中运行?

对于我荒谬的回答/问题,我深表歉意。我不想发布一个单独的问题,因为这听起来像是重复的。希望这个问题会得到更多的关注。

系统信息:Windows 10、Python 3.9.2、Spyder 4.2.3

于 2021-03-18T18:07:15.310 回答