Python: os.remove 无法工作

10 投票
3 回答
23831 浏览
提问于 2025-04-17 16:00

为什么我用 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 个回答

0

试着在打开或删除文件后加个延迟,比如用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上运行,并且使用了不太友好的杀毒软件或索引工具,就没有干净的解决办法可以保持相同的行为。你不能不停地创建和删除同名文件而不冒着被拒绝访问的风险。

不过,你可能只需打开和关闭文件一次,就能得到相同的结果。可以把原来的伪代码改成:

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

这个错误可能是你看到的任何东西……比如说,可能是权限问题?

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 

修改你的代码,让它显示错误信息,这样你就能知道为什么会失败了。文档可以帮到你。

撰写回答