diff -r 82607e7c24c7 Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py Fri Nov 11 12:07:48 2016 +0200 +++ b/Lib/test/support/__init__.py Fri Nov 11 13:49:19 2016 +0200 @@ -358,7 +358,37 @@ if sys.platform.startswith("win"): else: _unlink = os.unlink _rmdir = os.rmdir - _rmtree = shutil.rmtree + + def _rmtree(path): + try: + shutil.rmtree(path) + return + except OSError: + pass + + def force_run(path, func, *args): + try: + return func(*args) + except OSError as err: + if verbose >= 3: + print('%s: %s' % (err.__class__.__name__, err)) + print('re-run %s%r' %(func.__name__, args)) + os.chmod(path, stat.S_IRWXU) + return func(*args) + def _rmtree_inner(path): + for name in force_run(path, os.listdir, path): + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except OSError: + mode = 0 + if stat.S_ISDIR(mode): + _rmtree_inner(fullname) + force_run(path, os.rmdir, fullname) + else: + force_run(path, os.unlink, fullname) + _rmtree_inner(path) + os.rmdir(path) def unlink(filename): try: diff -r 82607e7c24c7 Lib/test/test_os.py --- a/Lib/test/test_os.py Fri Nov 11 12:07:48 2016 +0200 +++ b/Lib/test/test_os.py Fri Nov 11 13:49:19 2016 +0200 @@ -902,7 +902,7 @@ class WalkTests(unittest.TestCase): try: os.listdir(sub21_path) except PermissionError: - self.addCleanup(os.chmod, sub21_path, stat.S_IRWXU) + pass else: os.chmod(sub21_path, stat.S_IRWXU) os.unlink(tmp5_path)