在Python中删除只读目录

cwtwac6a  于 2023-01-08  发布在  Python
关注(0)|答案(7)|浏览(216)

shutil.rmtree不会删除Windows上的只读文件。有没有python的“rm -rf”等价物?为什么哦,为什么这是如此痛苦?

mbyulnm0

mbyulnm01#

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)

(我还没有测试过这个代码段,但应该足够让您入门了)

r6l8ljro

r6l8ljro2#

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

win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)

使文件不再是只读的。

8yparm6h

8yparm6h3#

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

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

gab6jxml4#

ActiveState网站上有一条评论说:
shutil.rmtree有它的缺点。虽然在许多情况下确实可以使用shutil.rmtree(),但在某些情况下它不起作用。例如,在Windows下标记为只读的文件不能被shutil.rmtree()删除。
通过从PyWin32导入win32api和win32con模块,并在rmgeneric()函数中添加类似“win32api.SetFileAttributes(path,win32con.FILE_ATTRIBUTE_NORMAL”这样的行,这个障碍就可以克服了.我用这种方法修复hot-backup.py了Subversion 1.4的www.example.com脚本,使其可以在Windows下工作.谢谢你的建议.
我不使用Windows,所以无法验证这是否有效。

qybjjes1

qybjjes15#

这个问题可能会在Python 3.5的发布版本中得到修复(目前-2015年6月-仍在开发中),在文档中给出了关于这个问题的提示。
您可以找到bugreport herethis是相应的变更集。
参见Python 3.5文档中新添加的示例:

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)
zrfyljdw

zrfyljdw6#

下面是Steve发布的一个变体,它使用相同的基本机制,并且这个 * 是 * 测试过的:-)
python脚本在windows中以什么用户身份运行?

3gtaxfhh

3gtaxfhh7#

我在Python 3.7中调用rmtree()时遇到了这个问题,并通过在退出TemporaryDirectory()上下文管理器之前显式地修复权限来解决它。有关详细信息,请参见akaihola/darker#453。下面是实现的副本:

import os
import sys
from pathlib import Path
from typing import Union

WINDOWS = sys.platform.startswith("win")

def fix_py37_win_tempdir_permissions(dirpath: Union[str, Path]) -> None:
    """Work around a `tempfile` clean-up issue on Windows with Python 3.7

    Call this before exiting a ``with TemporaryDirectory():`` block or in teardown for
    a Pytest fixture which creates a temporary directory.

    See discussion in https://github.com/akaihola/darker/pull/393
    Solution borrowed from https://github.com/python/cpython/pull/10320

    :param dirpath: The root path of the temporary directory

    """
    if not WINDOWS or sys.version_info >= (3, 8):
        return
    for root, dirs, files in os.walk(dirpath):
        for name in dirs + files:
            path = os.path.join(root, name)
            try:
                os.chflags(path, 0)  # type: ignore[attr-defined]
            except AttributeError:
                pass
            os.chmod(path, 0o700)

下面是如何在Pytest单元测试中使用它,或者在使用tempfile创建临时目录时使用它:

import pytest

from my_utils import fix_py37_win_tempdir_permissions

@pytest.fixture
def myfixture(tmp_path):
    # setup code here
    yield tmp_path
    fix_py37_win_tempdir_permissions(tmp_path)

def myfunc():
    with TemporaryDirectory() as tmpdir:
        # work on the temporary directory here
        fix_py37_win_tempdir_permissions(tmp_path)

相关问题