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)
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)
7条答案
按热度按时间mbyulnm01#
shutil.rmtree
可以有一个错误处理函数,当它在删除文件时遇到问题时会调用这个函数,你可以用它来强制删除有问题的文件。受http://mail.python.org/pipermail/tutor/2006-June/047551.html和http://techarttiki.blogspot.com/2008/08/read-only-windows-files-with-python.html启发:
(我还没有测试过这个代码段,但应该足够让您入门了)
r6l8ljro2#
如果你从PyWin32导入win32api,你可以用途:
使文件不再是只读的。
8yparm6h3#
另一种方法是在Windows上将rmtree定义为
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,所以无法验证这是否有效。
qybjjes15#
这个问题可能会在Python 3.5的发布版本中得到修复(目前-2015年6月-仍在开发中),在文档中给出了关于这个问题的提示。
您可以找到bugreport here。this是相应的变更集。
参见Python 3.5文档中新添加的示例:
zrfyljdw6#
下面是Steve发布的一个变体,它使用相同的基本机制,并且这个 * 是 * 测试过的:-)
python脚本在windows中以什么用户身份运行?
3gtaxfhh7#
我在Python 3.7中调用
rmtree()
时遇到了这个问题,并通过在退出TemporaryDirectory()
上下文管理器之前显式地修复权限来解决它。有关详细信息,请参见akaihola/darker#453。下面是实现的副本:下面是如何在Pytest单元测试中使用它,或者在使用
tempfile
创建临时目录时使用它: