快速问题。 我有一个脚本(使用安装规则)来编译程序,然后将生成的产品通过网络移动到远程目标。
但是,我一直收到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'
答案 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
的修改版本(因为您知道知道源和目标不在同一个文件系统上)