使用shutil.rmtree和os.mkdir覆盖目录有时会出现“访问被拒绝”错误

问题描述 投票:0回答:4

我的代码:

if os.path.exists(myDir):
    shutil.rmtree(myDir)
os.mkdir(myDir)

问题:如果 myDir 不存在,它总是有效。如果 myDir 存在,有时会抛出错误,有时会起作用。

错误日志:

os.mkdir(myDir)
PermissionError: [WinError 5] Access is denied: 'myDir'

我的猜测:当我调用os.mkdir时,有时shutil.rmtree尚未完成执行/尚未释放该目录的权限。因此,出现错误。

有什么方法可以确保在调用os.mkdir之前完全执行shutil.rmtree吗?

python python-3.x shutil
4个回答
4
投票

所以我遇到了同样的问题。我一直使用的是

shutil.rmtree
之后的暂停。我认为几乎任何能让计算机使用时钟周期的东西都可以。 所有代码:

import os 
import shutil 
import time

dataDir = 'C:/Data/'
if os.path.exists(TEMPDIR):
    shutil.rmtree(TEMPDIR)
time.sleep(.0000000000000001)
os.makedirs(TEMPDIR)

2
投票

如果一开始你没有成功......

if os.path.exists(report_path):
    shutil.rmtree(report_path)
while True:
    try:
        os.mkdir(report_path)
        break
    except PermissionError:
        print('Damned Win 10 PERMISSION exception, trying again')
        continue

...如果这不起作用,至少还有

<ctrl> -c


0
投票

我在 Windows 10 上遇到了类似的问题/相同的错误消息,对 Shutil.rmtree(dir) 的调用被拒绝访问,随后未被执行。这是我编写的一个原始备份程序,该程序旨在删除超过一定期限的备份。我仍在测试以下内容,但到目前为止,它可以作为我的设置中的临时解决方法,但您的里程可能会有所不同。

以管理员身份运行脚本也没有帮助。使用 os.chmod(f, S_IWRITE) [和/或 stat.S_IRUSR |统计S_IRGRP |统计.S_IROTH | stat.S_IXUSR |统计.S_IRUSR |统计.S_IWUSR |统计.S_IWGRP | stat.S_IXGRP] 也得到了操作系统同样的拒绝。更改受控文件夹访问权限(我怀疑在 Windows 10 中有时可能会导致这种情况)以及修改相应目录的只读属性也没有帮助。更改所有权或安全选项卡中的写入权限都没有帮助。

我目前使用的解决方法是安装、导入和使用“send2trash”模块,该模块可用于删除目录 - 假设你的程序是健全的 - 没有所述访问错误。

此后,可以手动或通过自动方式从回收站中删除文件(从 win32com.shell 导入 shell 后) - 显然第二步将从回收站中删除所有文件。因此,在运行此命令之前绝对要检查并思考,否则您可能会丢失您不想要的数据......)。

我希望这对你有帮助。


0
投票

您可以将 Promise 与 aioshutilasyncio 一起使用:

import asyncio
import aioshutil

myDir = 'your\\path\\derectory\\to\\overwrite\\here\\'

async def overwrite_dir(directory):
    if os.path.exists(directory):
         await aioshutil.rmtree(directory)
    os.mkdir(directory)

asyncio.run(overwrite_dir(myDir))
© www.soinside.com 2019 - 2024. All rights reserved.