Python:os.remove不工作

2024-06-26 13:53:38 发布

您现在位置: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

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


Tags: messageoutputreturntimeoscurrentremovejoin
3条回答

例外情况是有看!检查这个:

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可以帮你。

尝试放置一些延迟时间。打开/删除文件后睡眠(0.2)或 似乎是windows和/或防病毒问题

Josh Rosenberg关于python开发中的this错误跟踪指出了同样的问题:

简短版本:索引和反病毒工具防止删除发生。

较长版本: DeleteFile(以及所有最终转移到DeleteFile的东西)在Windows上以一种有趣的方式运行。在内部,它打开文件的句柄,将其标记为挂起删除,然后关闭句柄。如果在此期间没有人偷偷进入并获取该文件的另一个句柄,则在关闭DeleteFile的隐藏句柄时将删除该文件。精心设计的反病毒/索引工具使用oplock(http://blogs.msdn.com/b/oldnewthing/archive/2013/04/15/10410965.aspx)以便打开文件,但如果正常进程需要独占控制或删除文件,则可以无缝地避开它。遗憾的是,“精心设计”并不是一个通常与反病毒工具相关联的术语,因此类似这样的错误相对来说比较常见。

使用GetTempFileName()和move file()将文件移到一边这样的解决方案会起作用,尽管我相信它们会引入自己的竞争条件(临时文件本身是创建的,但句柄会立即关闭,这可能意味着坏的反病毒程序会阻止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

错误可能是你看到的任何东西。。。例如权限问题?

相关问题 更多 >