我有一个非常相似,也许相同的问题。经过一些测试,问题似乎部分出在我的 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