Python:os.remove不起作用

时间:2013-02-15 13:41:18

标签: python

为什么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。

3 个答案:

答案 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上运行,并且您使用的是不友好的防病毒/索引工具,则没有可以保持相同行为的干净解决方法。您无法反复创建和删除同名文件,而不会有访问被拒绝错误的风险。

也就是说,通过只打开和关闭文件一次,你可能得到相同的结果。从原始伪代码改变: