(path, ignore_errors=False, onerror=None)
Recursively delete a directory tree.

    If ignore_errors is set, errors are ignored; otherwise, if onerror
    is set, it is called to handle the error with arguments (func,
    path, exc_info) where func is platform and implementation dependent;
    path is the argument to that function that caused it to fail; and
    exc_info is a tuple returned by sys.exc_info().  If ignore_errors
    is false and onerror is None, an exception is raised.
Recursively delete a directory tree.
Recursively delete a directory tree .
def rmtree(path, ignore_errors=False, onerror=None):
    """Recursively delete a directory tree.

    If ignore_errors is set, errors are ignored; otherwise, if onerror
    is set, it is called to handle the error with arguments (func,
    path, exc_info) where func is platform and implementation dependent;
    path is the argument to that function that caused it to fail; and
    exc_info is a tuple returned by sys.exc_info().  If ignore_errors
    is false and onerror is None, an exception is raised.

    """
    sys.audit("shutil.rmtree", path)
    if ignore_errors:
        def onerror(*args):
            pass
    elif onerror is None:
        def onerror(*args):
            raise
    if _use_fd_functions:
        # While the unsafe rmtree works fine on bytes, the fd based does not.
        if isinstance(path, bytes):
            path = os.fsdecode(path)
        # Note: To guard against symlink races, we use the standard
        # lstat()/open()/fstat() trick.
        try:
            orig_st = os.lstat(path)
        except Exception:
            onerror(os.lstat, path, sys.exc_info())
            return
        try:
            fd = os.open(path, os.O_RDONLY)
        except Exception:
            onerror(os.open, path, sys.exc_info())
            return
        try:
            if os.path.samestat(orig_st, os.fstat(fd)):
                _rmtree_safe_fd(fd, path, onerror)
                try:
                    os.rmdir(path)
                except OSError:
                    onerror(os.rmdir, path, sys.exc_info())
            else:
                try:
                    # symlinks to directories are forbidden, see bug #1669
                    raise OSError("Cannot call rmtree on a symbolic link")
                except OSError:
                    onerror(os.path.islink, path, sys.exc_info())
        finally:
            os.close(fd)
    else:
        try:
            if _rmtree_islink(path):
                # symlinks to directories are forbidden, see bug #1669
                raise OSError("Cannot call rmtree on a symbolic link")
        except OSError:
            onerror(os.path.islink, path, sys.exc_info())
            # can't continue even if onerror hook returns
            return
        return _rmtree_unsafe(path, onerror)
def rmtree ( path , ignore_errors = False , onerror = None ) : sys . audit ( "shutil.rmtree" , path ) if ignore_errors : def onerror ( * args ) : pass elif onerror is None : def onerror ( * args ) : raise if _use_fd_functions : # While the unsafe rmtree works fine on bytes, the fd based does not. if isinstance ( path , bytes ) : path = os . fsdecode ( path ) # Note: To guard against symlink races, we use the standard # lstat()/open()/fstat() trick. try : orig_st = os . lstat ( path ) except Exception : onerror ( os . lstat , path , sys . exc_info ( ) ) return try : fd = os . open ( path , os . O_RDONLY ) except Exception : onerror ( os . open , path , sys . exc_info ( ) ) return try : if os . path . samestat ( orig_st , os . fstat ( fd ) ) : _rmtree_safe_fd ( fd , path , onerror ) try : os . rmdir ( path ) except OSError : onerror ( os . rmdir , path , sys . exc_info ( ) ) else : try : # symlinks to directories are forbidden, see bug #1669 raise OSError ( "Cannot call rmtree on a symbolic link" ) except OSError : onerror ( os . path . islink , path , sys . exc_info ( ) ) finally : os . close ( fd ) else : try : if _rmtree_islink ( path ) : # symlinks to directories are forbidden, see bug #1669 raise OSError ( "Cannot call rmtree on a symbolic link" ) except OSError : onerror ( os . path . islink , path , sys . exc_info ( ) ) # can't continue even if onerror hook returns return return _rmtree_unsafe ( path , onerror )