gpt4 book ai didi

即使我拥有完全权限,Python 在删除文件时也会出现 WindowsError 5

转载 作者:可可西里 更新时间:2023-11-01 10:32:02 27 4
gpt4 key购买 nike

关于 Windows 上 Python 的快速问题。我有一个编译程序的脚本(使用安装规则),然后通过网络将构建产品移动到远程目标。

但是,我不断收到 WindowsError 5 Access Denied。所有文件都是从脚本上下文创建的,我拥有所有这些文件的所有权和完全控制权。复制到远程目标成功,但失败是在删除过程中。如果我尝试在 Windows 中手动删除或重命名文件,我不会收到任何错误。只是 shutil.move 失败了。

我在想,也许 API 正在尝试在网络操作尚未完成时删除文件?

非常感谢任何输入。

try:
shutil.move(directory, destination)
except OSError:
print "Failed to move %s to %s." %(directory, destination)
raise

...

Traceback (most recent call last):
File "C:\WIP\BuildMachine\build_machine.py", line 176, in <module>
main()
File "C:\WIP\BuildMachine.hg\BuilderInstance.py", line 496, in deployVersion
shutil.move(directory, destination)
File "C:\Python27\lib\shutil.py", line 300, in move
rmtree(src)
File "C:\Python27\lib\shutil.py", line 252, in rmtree
onerror(os.remove, fullname, sys.exc_info())
File "C:\Python27\lib\shutil.py", line 250, in rmtree
os.remove(fullname)
WindowsError: [Error 5] Access is denied: '3_54_7__B_1\\Application_Release_Note.doc'

最佳答案

Windows 上 shutil.move 的问题在于它无法处理以下情况:

  • 源和目标不在同一个驱动器上并且
  • 源目录中的一些文件被写保护。

如果两个条件都满足,shutil.move 无法执行 os.rename,它必须:

  • 复制文件(这不是问题)
  • 删除源文件(由于 shutil 的限制,这一个问题)

为了解决这个问题,我为自己制作了一个 shutil 模块的副本(使用不同的名称)并添加了该行(对于您来说,它就在第 250 行之前):

   os.chmod(fullname,0o777)  # <-- add that line
os.remove(fullname) # some versions have "unlink" instead

rmtree 函数在 Windows 上也有同样的问题。

在 Linux 上这不会发生,因为文件删除权限不是在文件级别而是在目录级别处理的。在 Windows 上,它不能那样工作。添加 os.chmod 就可以了(即使它是 hack),并且 os.remove 成功(除非文件在 Word 或其他软件中打开)

请注意,shutil 作者鼓励您复制和改进功能。 shutil.move 文档中的注释:

A lot more could be done here... A look at a mv.c shows a lot of the issues this implementation glosses over.

如果您不想修改 shutil,您可以在源文件上运行递归 chmod 以确保 shutil.move 会起作用,例如像这样:

for root, dirs, files in os.walk(path):  
for f in dirs+files:
os.chmod(os.path.join(root, f), 0o777)

您还可以使用 shutil.copytree 然后是 shutil.rmtree 的修改版本(因为您知道源和目标不是在同一个文件系统上)

关于即使我拥有完全权限,Python 在删除文件时也会出现 WindowsError 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51090894/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com