9

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

4

3 回答 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 

修改您的代码以显示错误消息,您就会知道它失败的原因。文档可以帮助您。

于 2013-02-15T13:47:20.073 回答
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

该错误实际上可能是您看到的任何内容...例如权限问题?

于 2013-02-15T13:50:12.977 回答
0

尝试在打开/删除文件后放置一些延迟 time.sleep(0.2) 或者似乎是 Windows 和/或防病毒问题

Josh Rosenberg 在这个关于 python 开发的错误跟踪中指出了相同的点:

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

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

使用 GetTempFileName() 和 MoveFile() 将文件移开等解决方法将起作用,尽管我相信它们会引入自己的竞争条件(临时文件本身已创建但 HANDLE 立即关闭,这可能意味着竞争使用会阻止 MoveFile() 的不良防病毒软件打开空文件。

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

也就是说,您可能只需打开和关闭文件一次即可获得相同的结果。更改原始伪代码:

于 2018-02-06T13:28:38.077 回答