我有一个非常相似,也许相同的问题。经过一些测试,问题似乎部分出在我的 IDE Spyder 上。
问题
我有两个目录/test/a和/test/x. 我想将内容复制a到x. 我希望尽可能多地保留元数据,并且我不希望我的脚本因现有文件而失败(就像这个问题中的情况一样),所以我正在尝试使用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