【问题标题】:Deleting read-only directory in Python在 Python 中删除只读目录
【发布时间】:2010-12-25 18:22:33
【问题描述】:

shutil.rmtree 不会删除 Windows 上的只读文件。是否有相当于“rm -rf”的python?为什么哦,为什么这么痛苦?

【问题讨论】:

  • “为什么,为什么这么痛苦?”也许没有人花五分钟时间在bugs.python.org 提交错误...你可能是第一个!只是说。
  • 我知道我迟到了,但我刚刚提交了bugs.python.org/issue22040

标签: python directory delete-file


【解决方案1】:

shutil.rmtree 可以采用错误处理函数,当删除文件出现问题时将调用该函数。您可以使用它来强制删除有问题的文件。

灵感来自http://mail.python.org/pipermail/tutor/2006-June/047551.htmlhttp://techarttiki.blogspot.com/2008/08/read-only-windows-files-with-python.html

import os
import stat
import shutil

def remove_readonly(func, path, excinfo):
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(top, onerror=remove_readonly)

(我还没有测试过 sn-p,但它应该足以让你开始)

【讨论】:

  • 这对我来说就像一个魅力,即使在 Python 单元测试中也是如此。谢谢!
  • 单线:shutil.rmtree('mypath', onerror=lambda func, path, _: (os.chmod(path, stat.S_IWRITE), func(path)))
  • 如果目录不存在,即包含 ignore_errors=True 本身,此方法如何处理。
【解决方案2】:

如果你从 PyWin32 导入 win32api,你可以使用:

win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)

使文件不再是只读的。

【讨论】:

    【解决方案3】:

    另一种方法是将Windows上的rmtree定义为

    rmtree = lambda path: subprocess.check_call(['cmd', '/c', 'rd', '/s', '/q', path])
    

    【讨论】:

      【解决方案4】:

      这可能会随着 Python 3.5 的发布(目前 - 2015 年 6 月 - 仍在开发中)得到修复,因为在文档中对此给出了提示。

      您可以找到错误报告herethis 是相应的变更集。

      查看Python 3.5 docs中新添加的示例:

      import os, stat
      import shutil
      
      def remove_readonly(func, path, _):
          "Clear the readonly bit and reattempt the removal"
          os.chmod(path, stat.S_IWRITE)
          func(path)
      
      shutil.rmtree(directory, onerror=remove_readonly)
      

      【讨论】:

        【解决方案5】:

        ActiveState 网站上有一条评论说:

        shutil.rmtree 有它的缺点。尽管在许多情况下您可以使用 shutil.rmtree() ,但在某些情况下它不起作用。比如windows下标记为只读的文件,shutil.rmtree()是无法删除的。

        通过从 PyWin32 中导入 win32api 和 win32con 模块,并在 rmgeneric() 函数中添加“win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL”之类的行,可以克服这个障碍。我使用这种方法来修复热备份Subversion 1.4 的 .py 脚本,因此它可以在 Windows 下运行。谢谢你的秘诀。

        我不使用 Windows,因此无法验证这是否有效。

        【讨论】:

          【解决方案6】:

          这是史蒂夫发布的一个变体,它使用相同的基本机制,并且这个已经测试了:-)

          What user do python scripts run as in windows?

          【讨论】:

            猜你喜欢
            • 2011-01-19
            • 2010-10-11
            • 2011-04-21
            • 1970-01-01
            • 2013-03-17
            • 2011-01-15
            • 1970-01-01
            • 2018-07-31
            相关资源
            最近更新 更多