为什么os.remove(-string-)
不适合我?我的代码编写如下:
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
每次在客户端执行21:32:53 rmv failed: [?]
命令时,它都会返回rmv
。如果有帮助,我的Python版本是2.6.1。
答案 0 :(得分:9)
有例外是有待观察的!检查一下:
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
修改代码以显示错误消息,您就会知道它失败的原因。 The docs可以帮助您。
答案 1 :(得分:3)
为什么不尝试打印错误?
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
错误可能只是你看到的任何内容......例如权限问题?
答案 2 :(得分:0)
尝试在打开/删除文件后放置一些延迟时间.sleep(0.2)或 它似乎是一个Windows和/或防病毒问题
Josh Rosenberg关于python开发的this错误跟踪指出了相同的内容:
简短版本:索引和防病毒工具可防止发生删除。
更长的版本: DeleteFile(以及最终转移到DeleteFile的所有内容)在Windows上以一种有趣的方式运行。在内部,它打开文件的HANDLE,将其标记为待删除,并关闭HANDLE。如果在此期间没有人偷偷进入并抓取另一个HANDLE文件,那么当DeleteFile的隐藏HANDLE关闭时,该文件将被删除。精心设计的反病毒/索引工具使用oplocks(http://blogs.msdn.com/b/oldnewthing/archive/2013/04/15/10410965.aspx),因此他们可以打开文件,但如果正常进程需要对文件进行独占控制或删除它,则无缝地完成。可悲的是,#34;精心设计的"不是通常与反病毒工具相关的术语,因此这样的错误相对普遍。
使用GetTempFileName()和MoveFile()来移动文件的解决方法可行,但我相信它们会引入自己的竞争条件(临时文件本身已创建,但HANDLE会立即关闭,这可能意味着由阻止MoveFile()的坏反病毒打开空文件的竞赛。
基本上,如果您在Windows上运行,并且您使用的是不友好的防病毒/索引工具,则没有可以保持相同行为的干净解决方法。您无法反复创建和删除同名文件,而不会有访问被拒绝错误的风险。
也就是说,通过只打开和关闭文件一次,你可能得到相同的结果。从原始伪代码改变: