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

时间:2018-06-28 20:38:17

标签: python windows permissions shutil

关于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'

1 个答案:

答案 0 :(得分:1)

在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

在Windows上,rmtree函数存在相同的问题。

在Linux上不会发生这种情况,因为文件删除权限不是在文件级别而是在目录级别处理的。在Windows上,这种方式不起作用。添加os.chmod可以解决问题(即使是骇客),并且os.remove成功(除非文件已在Word中打开或以其他方式打开)

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

  

在这里还可以做更多...看一个mv.c可以看到很多       该实现掩盖的问题。

如果您不想修改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的修改版本(因为您知道知道源和目标不在同一个文件系统上)