Python: os.remove无法工作。

10

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

每当我在客户端执行rmv命令时,它都会返回21:32:53 rmv failed: [?]。我的Python版本是2.6.1,如果有帮助的话。


1
你试图删除什么类型的文件?os.remove不能用于目录...而且removedirs只有在目录非空时才起作用。 - mgilson
如果您没有收到错误或异常,而且删除命令仍然无法正常工作,会发生什么? - Darkgaze
3个回答

13

例外情况是值得关注的!请看这个例子:

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 

修改您的代码以显示错误信息,您将知道为什么它失败了。 文档 可以帮助您。


没关系,我使用了 print "Failed with:", e,现在它可以正常工作了。原来是因为我没有足够的权限。谢谢! - Eugene

5
为什么不尝试打印出错误?
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
发生了什么事情...一个权限问题。 - Eugene

0

尝试在打开/删除文件后加入一些延迟时间 time.sleep(0.2) 或者这似乎是Windows和/或杀毒软件的问题

Josh Rosenberg 在this错误跟踪Python开发时也指出了同样的问题:

简而言之:索引和杀毒工具会阻止删除操作。

更长的版本: DeleteFile(以及最终归结为DeleteFile的所有内容)在Windows上以一种有趣的方式运作。在内部,它打开一个文件的HANDLE,将其标记为待删除,并关闭该HANDLE。如果在此期间没有人偷偷地抓住了文件的另一个HANDLE,那么当DeleteFile的隐藏HANDLE关闭时,文件就会被删除。设计良好的反病毒/索引工具使用oplocks(http://blogs.msdn.com/b/oldnewthing/archive/2013/04/15/10410965.aspx),因此它们可以打开文件,但是如果普通进程需要独占控制文件或删除文件,则可以无缝退出。不幸的是,“设计良好”通常不是与反病毒工具相关的术语,因此此类错误相对常见。

像使用GetTempFileName()和MoveFile()将文件移出路径这样的解决方法可以起作用,但我认为它们会引入自己的竞争条件(临时文件本身被创建,但HANDLE立即关闭,这可能意味着坏的反病毒软件会阻止MoveFile()打开空文件的竞赛)。

基本上,如果你在 Windows 上运行,并且使用的是不友好的反病毒/索引工具,那么没有保持相同行为的干净解决方法。你不能一遍又一遍地创建和删除同名文件,否则会有访问被拒绝的错误。

也就是说,你可以通过只打开和关闭文件一次来获得相同的结果。从原始伪代码中进行更改:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接