python shutil.rmtree抛出错误

python shutil.rmtree抛出错误,python,python-2.7,Python,Python 2.7,有人能解释一下为什么shutil.rmtree会出现大量错误,说目录不是空的吗 Traceback (most recent call last): File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner self.run() File "C:\Python27\lib\threading.py", line 763, in run self.__target(*self.__args, **

有人能解释一下为什么shutil.rmtree会出现大量错误,说目录不是空的吗

Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Python27\lib\threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "W:\__init__.py", line 90, in makePatch
    myprog.copy_data()
  File "W:\myprog.py", line 143, in copy_data
    self.cleanupTempDir()
  File "W:\myprog.py", line 138, in cleanupTempDir
    shutil.rmtree(self.TEMP_DIR)
  File "C:\Python27\lib\shutil.py", line 247, in rmtree
    rmtree(fullname, ignore_errors, onerror)
  File "C:\Python27\lib\shutil.py", line 256, in rmtree
    onerror(os.rmdir, path, sys.exc_info())
  File "C:\Python27\lib\shutil.py", line 254, in rmtree
    os.rmdir(path)
WindowsError: [Error 145] The directory is not empty: u'e:\\PatchData\\Data'

看起来这些文件被标记为只读。在添加一行以删除文件复制后的只读标志后,我不再收到此错误。奇怪的是,它看起来甚至没有试图删除文件,或者至少没有在文件上引发任何异常,只是在目录上。

Linux:我在处理临时文件夹时也遇到了这个错误:我在
\init\uu
构造函数和
shutil.rmtree
\uuu del\uuu
解构器中调用,代码使用了
多处理
库;该文件夹是按顺序构造的,但在执行过程终止时会被销毁。因此,错误并不总是可复制的,但据推测,只有当两个进程试图同时销毁文件夹时才会发生错误,并且没有适当的锁定机制,才会抛出这些错误。之所以发生这种情况,是因为不知什么原因,
解构器被多次调用

错误如下:

Exception ignored in: <function VideoMaker.__del__ at 0x7f6066a888b0>
Traceback (most recent call last):
  File "VideoMaker.py", line 49, in __del__
    onerror(os.unlink, fullname, sys.exc_info())
  File "/home/Marco/miniconda3/lib/python3.8/shutil.py", line 670, in _rmtree_safe_fd
    onerror(os.rmdir, path, sys.exc_info())
  File "/home/Marco/miniconda3/lib/python3.8/shutil.py", line 717, in rmtree
    _rmtree_safe_fd(fd, path, onerror)
    shutil.rmtree(self.temp_videoclip_dir)    
  File "/home/Marco/miniconda3/lib/python3.8/shutil.py", line 672, in _rmtree_safe_fd
  File "/home/Marco/miniconda3/lib/python3.8/shutil.py", line 715, in rmtree
    onerror(os.unlink, fullname, sys.exc_info())
  File "/home/Marco/miniconda3/lib/python3.8/shutil.py", line 670, in _rmtree_safe_fd
    os.unlink(entry.name, dir_fd=topfd)
FileNotFoundError: [Errno 2] No such file or directory: '12.mp4'

不要在解构器中使用
rmtree
: 对象解构器可能并不总是具有可预测的行为,例如在内部使用操作系统的IO操作。而是创建一个单独的函数,并在对象范围的末尾调用它

如果使用多处理或线程:
LOCK
文件:

文档示例:


如果真的没有其他办法:
可能有某个外部进程不断向该目录添加新文件?不,没有外部进程写入该位置。可能有一个隐藏的文件。在os.walk(u'e:\\PatchData\\Data'):打印x时尝试
。如果打印了多个项目,则仍有文件。因此,复制此项目的源上没有隐藏的文件。还有一些文件留在那里,因为它们没有被shutil.rmtree删除。留下了什么类型的文件?所有的文件都没动吗?它是否仅在该树中的特定目录中出现(如果将该目录移到其他位置,调用是否成功)?您好,您添加了哪行来删除只读标志?对于分配给特定用户的临时文件夹,我收到了相同的错误。您好,请提供更多详细信息。添加行的位置和方式。是否应该在shutil.py中?添加的行可能是os.chmod()?从:“尽管Windows支持chmod(),但您只能使用它设置文件的只读标志(通过stat.s_IWRITE和stat.s_IREAD常量或相应的整数值)。所有其他位都将被忽略。”
OSError: [Errno 39] Directory not empty: 'tmp/tmp.videoclips/'
l.acquire()
try:
    if os.path.isdir(path_to_delete):
        shutil.rmtree(path_to_delete)
finally:
    l.release()
def try_to_rmtree(can_still_retry):
    if can_still_retry:
        try:
            if os.path.isdir(path_to_delete):
                shutil.rmtree(path_to_delete)
        except:
            try_to_rmtree(can_still_retry -1)

can_still_retry = 5
try_to_rmtree(can_still_retry)