Python: os.remove 无法工作
为什么我用 os.remove(-字符串-)
不管用呢?我写的代码是这样的:
try:
os.remove(a)
output = current_time() + "\trmv successful"
message = message + '\n' + output
message = "".join(message)
return message
except OSError:
try:
os.removedirs(a)
output = current_time() + "\trmv successful"
message = message + '\n' + output
message = "".join(message)
return message
except OSError:
output = current_time() + "\trmv failed: [?]"
message = message + '\n' + output
message = "".join(message)
return message
每次我在客户端执行 rmv
命令时,它都会返回 21:32:53 rmv failed: [?]
。我的Python版本是2.6.1,如果这有帮助的话。
3 个回答
试着在打开或删除文件后加个延迟,比如用time.sleep(0.2)。或者,这可能是Windows系统和/或杀毒软件的问题。
Josh Rosenberg在这个关于Python开发的错误追踪中也提到过类似的情况:
简而言之:索引和杀毒工具会阻止文件被删除。
详细说说:在Windows上,DeleteFile(以及所有最终调用DeleteFile的操作)工作方式有点特别。它内部会打开一个文件的句柄,把这个文件标记为待删除,然后关闭这个句柄。如果在这段时间内没有其他程序偷偷打开这个文件的句柄,那么当DeleteFile的隐藏句柄关闭时,文件就会被删除。设计良好的杀毒软件和索引工具会使用一种叫做oplocks的机制(http://blogs.msdn.com/b/oldnewthing/archive/2013/04/15/10410965.aspx),这样它们可以打开文件,但如果有正常的程序需要独占控制或删除这个文件时,它们会自动让开。可惜的是,“设计良好”这个词通常和杀毒软件无缘,所以像这样的错误相对常见。
可以尝试一些变通方法,比如使用GetTempFileName()和MoveFile()把文件移开,虽然我认为这样可能会引入自己的竞争条件(临时文件被创建后,句柄立即关闭,这可能导致坏的杀毒软件抢先打开这个空文件,从而阻止MoveFile()的执行)。
总的来说,如果你在Windows上运行,并且使用了不太友好的杀毒软件或索引工具,就没有干净的解决办法可以保持相同的行为。你不能不停地创建和删除同名文件而不冒着被拒绝访问的风险。
不过,你可能只需打开和关闭文件一次,就能得到相同的结果。可以把原来的伪代码改成:
你为什么不试着把错误信息打印出来呢?
try:
os.remove(a)
output = current_time() + "\trmv successful"
message = message + '\n' + output
message = "".join(message)
return message
except OSError, e:
print ("Failed to remove %s\nError is: %s" % (a,e))
try:
os.removedirs(a)
output = current_time() + "\trmv successful"
message = message + '\n' + output
message = "".join(message)
return message
except OSError, e:
print ("Failed twice to remove %s\nError is: %s" % (a,e))
output = current_time() + "\trmv failed: [?]"
message = message + '\n' + output
message = "".join(message)
return message
这个错误可能是你看到的任何东西……比如说,可能是权限问题?
异常是需要关注的!看看这个:
try:
os.remove(a)
except OSError as e: # name the Exception `e`
print "Failed with:", e.strerror # look what it says
print "Error code:", e.code
修改你的代码,让它显示错误信息,这样你就能知道为什么会失败了。文档可以帮到你。