:mod:`!shutil` --- High-level file operations
=============================================

.. module:: shutil
   :synopsis: High-level file operations, including copying.

.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
.. partly based on the docstrings

**Source code:** :source:`Lib/shutil.py`

.. index::
   single: file; copying
   single: copying files

--------------

The :mod:`shutil` module offers a number of high-level operations on files and
collections of files.  In particular, functions are provided  which support file
copying and removal. For operations on individual files, see also the
:mod:`os` module.

.. warning::

   Even the higher-level file copying functions (:func:`shutil.copy`,
   :func:`shutil.copy2`) cannot copy all file metadata.

   On POSIX platforms, this means that file owner and group are lost as well
   as ACLs.  On Mac OS, the resource fork and other metadata are not used.
   This means that resources will be lost and file type and creator codes will
   not be correct. On Windows, file owners, ACLs and alternate data streams
   are not copied.


.. _file-operations:

Directory and files operations
------------------------------

.. function:: copyfileobj(fsrc, fdst[, length])

   Copy the contents of the :term:`file-like object <file object>` *fsrc* to the file-like object *fdst*.
   The integer *length*, if given, is the buffer size. In particular, a negative
   *length* value means to copy the data without looping over the source data in
   chunks; by default the data is read in chunks to avoid uncontrolled memory
   consumption. Note that if the current file position of the *fsrc* object is not
   0, only the contents from the current file position to the end of the file will
   be copied.

   :func:`copyfileobj` will *not* guarantee that the destination stream has
   been flushed on completion of the copy. If you want to read from the
   destination at the completion of the copy operation (for example, reading
   the contents of a temporary file that has been copied from a HTTP stream),
   you must ensure that you have called :func:`~io.IOBase.flush` or
   :func:`~io.IOBase.close` on the file-like object before attempting to read
   the destination file.

.. function:: copyfile(src, dst, *, follow_symlinks=True)

   Copy the contents (no metadata) of the file named *src* to a file named
   *dst* and return *dst* in the most efficient way possible.
   *src* and *dst* are :term:`path-like objects <path-like object>` or path names given as strings.

   *dst* must be the complete target file name; look at :func:`~shutil.copy`
   for a copy that accepts a target directory path.  If *src* and *dst*
   specify the same file, :exc:`SameFileError` is raised.

   The destination location must be writable; otherwise, an :exc:`OSError`
   exception will be raised. If *dst* already exists, it will be replaced.
   Special files such as character or block devices and pipes cannot be
   copied with this function.

   If *follow_symlinks* is false and *src* is a symbolic link,
   a new symbolic link will be created instead of copying the
   file *src* points to.

   .. audit-event:: shutil.copyfile src,dst shutil.copyfile

   .. versionchanged:: 3.3
      :exc:`IOError` used to be raised instead of :exc:`OSError`.
      Added *follow_symlinks* argument.
      Now returns *dst*.

   .. versionchanged:: 3.4
      Raise :exc:`SameFileError` instead of :exc:`Error`.  Since the former is
      a subclass of the latter, this change is backward compatible.

   .. versionchanged:: 3.8
      Platform-specific fast-copy syscalls may be used internally in order to
      copy the file more efficiently. See
      :ref:`shutil-platform-dependent-efficient-copy-operations` section.

.. exception:: SpecialFileError

   This exception is raised when :func:`copyfile` or :func:`copytree` attempt
   to copy a named pipe.

   .. versionadded:: 2.7

.. exception:: SameFileError

   This exception is raised if source and destination in :func:`copyfile`
   are the same file.

   .. versionadded:: 3.4


.. function:: copymode(src, dst, *, follow_symlinks=True)

   Copy the permission bits from *src* to *dst*.  The file contents, owner, and
   group are unaffected.  *src* and *dst* are :term:`path-like objects <path-like object>` or path names
   given as strings.
   If *follow_symlinks* is false, and both *src* and *dst* are symbolic links,
   :func:`copymode` will attempt to modify the mode of *dst* itself (rather
   than the file it points to).  This functionality is not available on every
   platform; please see :func:`copystat` for more information.  If
   :func:`copymode` cannot modify symbolic links on the local platform, and it
   is asked to do so, it will do nothing and return.

   .. audit-event:: shutil.copymode src,dst shutil.copymode

   .. versionchanged:: 3.3
      Added *follow_symlinks* argument.

.. function:: copystat(src, dst, *, follow_symlinks=True)

   Copy the permission bits, last access time, last modification time, and
   flags from *src* to *dst*.  On Linux, :func:`copystat` also copies the
   "extended attributes" where possible.  The file contents, owner, and
   group are unaffected.  *src* and *dst* are :term:`path-like objects <path-like object>` or path
   names given as strings.

   If *follow_symlinks* is false, and *src* and *dst* both
   refer to symbolic links, :func:`copystat` will operate on
   the symbolic links themselves rather than the files the
   symbolic links refer to—reading the information from the
   *src* symbolic link, and writing the information to the
   *dst* symbolic link.

   .. note::

      Not all platforms provide the ability to examine and
      modify symbolic links.  Python itself can tell you what
      functionality is locally available.

      * If ``os.chmod in os.supports_follow_symlinks`` is
        ``True``, :func:`copystat` can modify the permission
        bits of a symbolic link.

      * If ``os.utime in os.supports_follow_symlinks`` is
        ``True``, :func:`copystat` can modify the last access
        and modification times of a symbolic link.

      * If ``os.chflags in os.supports_follow_symlinks`` is
        ``True``, :func:`copystat` can modify the flags of
        a symbolic link.  (``os.chflags`` is not available on
        all platforms.)

      On platforms where some or all of this functionality
      is unavailable, when asked to modify a symbolic link,
      :func:`copystat` will copy everything it can.
      :func:`copystat` never returns failure.

      Please see :data:`os.supports_follow_symlinks`
      for more information.

   .. audit-event:: shutil.copystat src,dst shutil.copystat

   .. versionchanged:: 3.3
      Added *follow_symlinks* argument and support for Linux extended attributes.

.. function:: copy(src, dst, *, follow_symlinks=True)

   Copies the file *src* to the file or directory *dst*.  *src* and *dst*
   should be :term:`path-like objects <path-like object>` or strings.  If
   *dst* specifies a directory, the file will be copied into *dst* using the
   base filename from *src*. If *dst* specifies a file that already exists,
   it will be replaced. Returns the path to the newly created file.

   If *follow_symlinks* is false, and *src* is a symbolic link,
   *dst* will be created as a symbolic link.  If *follow_symlinks*
   is true and *src* is a symbolic link, *dst* will be a copy of
   the file *src* refers to.

   :func:`~shutil.copy` copies the file data and the file's permission
   mode (see :func:`os.chmod`).  Other metadata, like the
   file's creation and modification times, is not preserved.
   To preserve all file metadata from the original, use
   :func:`~shutil.copy2` instead.

   .. audit-event:: shutil.copyfile src,dst shutil.copy

   .. audit-event:: shutil.copymode src,dst shutil.copy

   .. versionchanged:: 3.3
      Added *follow_symlinks* argument.
      Now returns path to the newly created file.

   .. versionchanged:: 3.8
      Platform-specific fast-copy syscalls may be used internally in order to
      copy the file more efficiently. See
      :ref:`shutil-platform-dependent-efficient-copy-operations` section.

.. function:: copy2(src, dst, *, follow_symlinks=True)

   Identical to :func:`~shutil.copy` except that :func:`copy2`
   also attempts to preserve file metadata.

   When *follow_symlinks* is false, and *src* is a symbolic
   link, :func:`copy2` attempts to copy all metadata from the
   *src* symbolic link to the newly created *dst* symbolic link.
   However, this functionality is not available on all platforms.
   On platforms where some or all of this functionality is
   unavailable, :func:`copy2` will preserve all the metadata
   it can; :func:`copy2` never raises an exception because it
   cannot preserve file metadata.

   :func:`copy2` uses :func:`copystat` to copy the file metadata.
   Please see :func:`copystat` for more information
   about platform support for modifying symbolic link metadata.

   .. audit-event:: shutil.copyfile src,dst shutil.copy2

   .. audit-event:: shutil.copystat src,dst shutil.copy2

   .. versionchanged:: 3.3
      Added *follow_symlinks* argument, try to copy extended
      file system attributes too (currently Linux only).
      Now returns path to the newly created file.

   .. versionchanged:: 3.8
      Platform-specific fast-copy syscalls may be used internally in order to
      copy the file more efficiently. See
      :ref:`shutil-platform-dependent-efficient-copy-operations` section.

.. function:: ignore_patterns(*patterns)

   This factory function creates a function that can be used as a callable for
   :func:`copytree`\'s *ignore* argument, ignoring files and directories that
   match one of the glob-style *patterns* provided.  See the example below.


.. function:: copytree(src, dst, symlinks=False, ignore=None, \
              copy_function=copy2, ignore_dangling_symlinks=False, \
              dirs_exist_ok=False)

   Recursively copy an entire directory tree rooted at *src* to a directory
   named *dst* and return the destination directory.  All intermediate
   directories needed to contain *dst* will also be created by default.

   Permissions and times of directories are copied with :func:`copystat`,
   individual files are copied using :func:`~shutil.copy2`.

   If *symlinks* is true, symbolic links in the source tree are represented as
   symbolic links in the new tree and the metadata of the original links will
   be copied as far as the platform allows; if false or omitted, the contents
   and metadata of the linked files are copied to the new tree.

   When *symlinks* is false, if the file pointed to by the symlink doesn't
   exist, an exception will be added in the list of errors raised in
   an :exc:`Error` exception at the end of the copy process.
   You can set the optional *ignore_dangling_symlinks* flag to true if you
   want to silence this exception. Notice that this option has no effect
   on platforms that don't support :func:`os.symlink`.

   If *ignore* is given, it must be a callable that will receive as its
   arguments the directory being visited by :func:`copytree`, and a list of its
   contents, as returned by :func:`os.listdir`.  Since :func:`copytree` is
   called recursively, the *ignore* callable will be called once for each
   directory that is copied.  The callable must return a sequence of directory
   and file names relative to the current directory (i.e. a subset of the items
   in its second argument); these names will then be ignored in the copy
   process.  :func:`ignore_patterns` can be used to create such a callable that
   ignores names based on glob-style patterns.

   If exception(s) occur, an :exc:`Error` is raised with a list of reasons.

   If *copy_function* is given, it must be a callable that will be used to copy
   each file. It will be called with the source path and the destination path
   as arguments. By default, :func:`~shutil.copy2` is used, but any function
   that supports the same signature (like :func:`~shutil.copy`) can be used.

   If *dirs_exist_ok* is false (the default) and *dst* already exists, a
   :exc:`FileExistsError` is raised. If *dirs_exist_ok* is true, the copying
   operation will continue if it encounters existing directories, and files
   within the *dst* tree will be overwritten by corresponding files from the
   *src* tree.

   .. audit-event:: shutil.copytree src,dst shutil.copytree

   .. versionchanged:: 3.2
      Added the *copy_function* argument to be able to provide a custom copy
      function.
      Added the *ignore_dangling_symlinks* argument to silence dangling symlinks
      errors when *symlinks* is false.

   .. versionchanged:: 3.3
      Copy metadata when *symlinks* is false.
      Now returns *dst*.

   .. versionchanged:: 3.8
      Platform-specific fast-copy syscalls may be used internally in order to
      copy the file more efficiently. See
      :ref:`shutil-platform-dependent-efficient-copy-operations` section.

   .. versionchanged:: 3.8
      Added the *dirs_exist_ok* parameter.

.. function:: rmtree(path, ignore_errors=False, onerror=None, *, onexc=None, dir_fd=None)

   .. index:: single: directory; deleting

   Delete an entire directory tree; *path* must point to a directory (but not a
   symbolic link to a directory).  If *ignore_errors* is true, errors resulting
   from failed removals will be ignored; if false or omitted, such errors are
   handled by calling a handler specified by *onexc* or *onerror* or, if both
   are omitted, exceptions are propagated to the caller.

   This function can support :ref:`paths relative to directory descriptors
   <dir_fd>`.

   .. note::

      On platforms that support the necessary fd-based functions a symlink
      attack resistant version of :func:`rmtree` is used by default.  On other
      platforms, the :func:`rmtree` implementation is susceptible to a symlink
      attack: given proper timing and circumstances, attackers can manipulate
      symlinks on the filesystem to delete files they wouldn't be able to access
      otherwise.  Applications can use the :data:`rmtree.avoids_symlink_attacks`
      function attribute to determine which case applies.

   If *onexc* is provided, it must be a callable that accepts three parameters:
   *function*, *path*, and *excinfo*.

   The first parameter, *function*, is the function which raised the exception;
   it depends on the platform and implementation.  The second parameter,
   *path*, will be the path name passed to *function*.  The third parameter,
   *excinfo*, is the exception that was raised. Exceptions raised by *onexc*
   will not be caught.

   The deprecated *onerror* is similar to *onexc*, except that the third
   parameter it receives is the tuple returned from :func:`sys.exc_info`.

   .. seealso::
      :ref:`shutil-rmtree-example` for an example of handling the removal
      of a directory tree that contains read-only files.

   .. audit-event:: shutil.rmtree path,dir_fd shutil.rmtree

   .. versionchanged:: 3.3
      Added a symlink attack resistant version that is used automatically
      if platform supports fd-based functions.

   .. versionchanged:: 3.8
      On Windows, will no longer delete the contents of a directory junction
      before removing the junction.

   .. versionchanged:: 3.11
      Added the *dir_fd* parameter.

   .. versionchanged:: 3.12
      Added the *onexc* parameter, deprecated *onerror*.

   .. versionchanged:: 3.13
      :func:`!rmtree` now ignores :exc:`FileNotFoundError` exceptions for all
      but the top-level path.
      Exceptions other than :exc:`OSError` and subclasses of :exc:`!OSError`
      are now always propagated to the caller.

   .. attribute:: rmtree.avoids_symlink_attacks

      Indicates whether the current platform and implementation provides a
      symlink attack resistant version of :func:`rmtree`.  Currently this is
      only true for platforms supporting fd-based directory access functions.

      .. versionadded:: 3.3


.. function:: move(src, dst, copy_function=copy2)

   Recursively move a file or directory (*src*) to another location and return
   the destination.

   If *dst* is an existing directory or a symlink to a directory, then *src*
   is moved inside that directory. The destination path in that directory must
   not already exist.

   If *dst* already exists but is not a directory, it may be overwritten
   depending on :func:`os.rename` semantics.

   If the destination is on the current filesystem, then :func:`os.rename` is
   used. Otherwise, *src* is copied to the destination using *copy_function*
   and then removed.  In case of symlinks, a new symlink pointing to the target
   of *src* will be created as the destination and *src* will be removed.

   If *copy_function* is given, it must be a callable that takes two arguments,
   *src* and the destination, and will be used to copy *src* to the destination
   if :func:`os.rename` cannot be used.  If the source is a directory,
   :func:`copytree` is called, passing it the *copy_function*. The
   default *copy_function* is :func:`copy2`.  Using :func:`~shutil.copy` as the
   *copy_function* allows the move to succeed when it is not possible to also
   copy the metadata, at the expense of not copying any of the metadata.

   .. audit-event:: shutil.move src,dst shutil.move

   .. versionchanged:: 3.3
      Added explicit symlink handling for foreign filesystems, thus adapting
      it to the behavior of GNU's :program:`mv`.
      Now returns *dst*.

   .. versionchanged:: 3.5
      Added the *copy_function* keyword argument.

   .. versionchanged:: 3.8
      Platform-specific fast-copy syscalls may be used internally in order to
      copy the file more efficiently. See
      :ref:`shutil-platform-dependent-efficient-copy-operations` section.

   .. versionchanged:: 3.9
      Accepts a :term:`path-like object` for both *src* and *dst*.

.. function:: disk_usage(path)

   Return disk usage statistics about the given path as a :term:`named tuple`
   with the attributes *total*, *used* and *free*, which are the amount of
   total, used and free space, in bytes. *path* may be a file or a
   directory.

   .. note::

      On Unix filesystems, *path* must point to a path within a **mounted**
      filesystem partition. On those platforms, CPython doesn't attempt to
      retrieve disk usage information from non-mounted filesystems.

   .. versionadded:: 3.3

   .. versionchanged:: 3.8
     On Windows, *path* can now be a file or directory.

   .. availability:: Unix, Windows.

.. function:: chown(path, user=None, group=None, *, dir_fd=None, \
                    follow_symlinks=True)

   Change owner *user* and/or *group* of the given *path*.

   *user* can be a system user name or a uid; the same applies to *group*. At
   least one argument is required.

   See also :func:`os.chown`, the underlying function.

   .. audit-event:: shutil.chown path,user,group shutil.chown

   .. availability:: Unix.

   .. versionadded:: 3.3

   .. versionchanged:: 3.13
      Added *dir_fd* and *follow_symlinks* parameters.


.. function:: which(cmd, mode=os.F_OK | os.X_OK, path=None)

   Return the path to an executable which would be run if the given *cmd* was
   called.  If no *cmd* would be called, return ``None``.

   *mode* is a permission mask passed to :func:`os.access`, by default
   determining if the file exists and is executable.

   *path* is a "``PATH`` string" specifying the directories to look in,
   delimited by :data:`os.pathsep`. When no *path* is specified, the
   :envvar:`PATH` environment variable is read from :data:`os.environ`,
   falling back to :data:`os.defpath` if it is not set.

   If *cmd* contains a directory component, :func:`!which` only checks the
   specified path directly and does not search the directories listed in
   *path* or in the system's :envvar:`PATH` environment variable.

   On Windows, the current directory is prepended to the *path* if *mode* does
   not include ``os.X_OK``. When the *mode* does include ``os.X_OK``, the
   Windows API ``NeedCurrentDirectoryForExePathW`` will be consulted to
   determine if the current directory should be prepended to *path*. To avoid
   consulting the current working directory for executables: set the environment
   variable ``NoDefaultCurrentDirectoryInExePath``.

   Also on Windows, the :envvar:`PATHEXT` environment variable is used to
   resolve commands that may not already include an extension. For example,
   if you call ``shutil.which("python")``, :func:`which` will search ``PATHEXT``
   to know that it should look for ``python.exe`` within the *path*
   directories. For example, on Windows::

      >>> shutil.which("python")
      'C:\\Python33\\python.EXE'

   This is also applied when *cmd* is a path that contains a directory
   component::

      >>> shutil.which("C:\\Python33\\python")
      'C:\\Python33\\python.EXE'

   .. versionadded:: 3.3

   .. versionchanged:: 3.8
      The :class:`bytes` type is now accepted.  If *cmd* type is
      :class:`bytes`, the result type is also :class:`bytes`.

   .. versionchanged:: 3.12
      On Windows, the current directory is no longer prepended to the search
      path if *mode* includes ``os.X_OK`` and WinAPI
      ``NeedCurrentDirectoryForExePathW(cmd)`` is false, else the current
      directory is prepended even if it is already in the search path;
      ``PATHEXT`` is used now even when *cmd* includes a directory component
      or ends with an extension that is in ``PATHEXT``; and filenames that
      have no extension can now be found.

.. exception:: Error

   Subclass of :exc:`OSError` collecting exceptions raised during a multi-file
   operation. For :func:`copytree`, the exception argument is a list of 3-tuples
   (*srcname*, *dstname*, *exception*).

.. _shutil-platform-dependent-efficient-copy-operations:

Platform-dependent efficient copy operations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Starting from Python 3.8, all functions involving a file copy
(:func:`copyfile`, :func:`~shutil.copy`, :func:`copy2`,
:func:`copytree`, and :func:`move`) may use
platform-specific "fast-copy" syscalls in order to copy the file more
efficiently (see :issue:`33671`).
"fast-copy" means that the copying operation occurs within the kernel, avoiding
the use of userspace buffers in Python as in "``outfd.write(infd.read())``".

On macOS `fcopyfile`_ is used to copy the file content (not metadata).

On Linux :func:`os.copy_file_range` or :func:`os.sendfile` is used.

On Solaris :func:`os.sendfile` is used.

On Windows :func:`shutil.copyfile` uses a bigger default buffer size (1 MiB
instead of 64 KiB) and a :func:`memoryview`-based variant of
:func:`shutil.copyfileobj` is used.

If the fast-copy operation fails and no data was written in the destination
file then shutil will silently fallback on using less efficient
:func:`copyfileobj` function internally.

.. versionchanged:: 3.8

.. versionchanged:: 3.14
    Solaris now uses :func:`os.sendfile`.

.. versionchanged:: 3.14
   Copy-on-write or server-side copy may be used internally via
   :func:`os.copy_file_range` on supported Linux filesystems.

.. _shutil-copytree-example:

copytree example
~~~~~~~~~~~~~~~~

An example that uses the :func:`ignore_patterns` helper::

   from shutil import copytree, ignore_patterns

   copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))

This will copy everything except ``.pyc`` files and files or directories whose
name starts with ``tmp``.

Another example that uses the *ignore* argument to add a logging call::

   from shutil import copytree
   import logging

   def _logpath(path, names):
       logging.info('Working in %s', path)
       return []   # nothing will be ignored

   copytree(source, destination, ignore=_logpath)


.. _shutil-rmtree-example:

rmtree example
~~~~~~~~~~~~~~

This example shows how to remove a directory tree on Windows where some
of the files have their read-only bit set. It uses the onexc callback
to clear the readonly bit and reattempt the remove. Any subsequent failure
will propagate. ::

    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, onexc=remove_readonly)

.. _archiving-operations:

Archiving operations
--------------------

.. versionadded:: 3.2

.. versionchanged:: 3.5
    Added support for the *xztar* format.


High-level utilities to create and read compressed and archived files are also
provided.  They rely on the :mod:`zipfile` and :mod:`tarfile` modules.

.. function:: make_archive(base_name, format, [root_dir, [base_dir, [verbose, [dry_run, [owner, [group, [logger]]]]]]])

   Create an archive file (such as zip or tar) and return its name.

   *base_name* is the name of the file to create, including the path, minus
   any format-specific extension.

   *format* is the archive format: one of
   "zip" (if the :mod:`zlib` module is available), "tar", "gztar" (if the
   :mod:`zlib` module is available), "bztar" (if the :mod:`bz2` module is
   available), "xztar" (if the :mod:`lzma` module is available), or "zstdtar"
   (if the :mod:`compression.zstd` module is available).

   *root_dir* is a directory that will be the root directory of the
   archive, all paths in the archive will be relative to it; for example,
   we typically chdir into *root_dir* before creating the archive.

   *base_dir* is the directory where we start archiving from;
   i.e. *base_dir* will be the common prefix of all files and
   directories in the archive.  *base_dir* must be given relative
   to *root_dir*.  See :ref:`shutil-archiving-example-with-basedir` for how to
   use *base_dir* and *root_dir* together.

   *root_dir* and *base_dir* both default to the current directory.

   If *dry_run* is true, no archive is created, but the operations that would be
   executed are logged to *logger*.

   *owner* and *group* are used when creating a tar archive. By default,
   uses the current owner and group.

   *logger* must be an object compatible with :pep:`282`, usually an instance of
   :class:`logging.Logger`.

   The *verbose* argument is unused and deprecated.

   .. audit-event:: shutil.make_archive base_name,format,root_dir,base_dir shutil.make_archive

   .. note::

      This function is not thread-safe when custom archivers registered
      with :func:`register_archive_format` do not support the *root_dir*
      argument.  In this case it
      temporarily changes the current working directory of the process
      to *root_dir* to perform archiving.

   .. versionchanged:: 3.8
      The modern pax (POSIX.1-2001) format is now used instead of
      the legacy GNU format for archives created with ``format="tar"``.

   .. versionchanged:: 3.10.6
      This function is now made thread-safe during creation of standard
      ``.zip`` and tar archives.

.. function:: get_archive_formats()

   Return a list of supported formats for archiving.
   Each element of the returned sequence is a tuple ``(name, description)``.

   By default :mod:`shutil` provides these formats:

   - *zip*: ZIP file (if the :mod:`zlib` module is available).
   - *tar*: Uncompressed tar file. Uses POSIX.1-2001 pax format for new archives.
   - *gztar*: gzip'ed tar-file (if the :mod:`zlib` module is available).
   - *bztar*: bzip2'ed tar-file (if the :mod:`bz2` module is available).
   - *xztar*: xz'ed tar-file (if the :mod:`lzma` module is available).
   - *zstdtar*: Zstandard compressed tar-file (if the :mod:`compression.zstd`
     module is available).

   You can register new formats or provide your own archiver for any existing
   formats, by using :func:`register_archive_format`.


.. function:: register_archive_format(name, function, [extra_args, [description]])

   Register an archiver for the format *name*.

   *function* is the callable that will be used to unpack archives. The callable
   will receive the *base_name* of the file to create, followed by the
   *base_dir* (which defaults to :data:`os.curdir`) to start archiving from.
   Further arguments are passed as keyword arguments: *owner*, *group*,
   *dry_run* and *logger* (as passed in :func:`make_archive`).

   If *function* has the custom attribute ``function.supports_root_dir`` set to ``True``,
   the *root_dir* argument is passed as a keyword argument.
   Otherwise the current working directory of the process is temporarily
   changed to *root_dir* before calling *function*.
   In this case :func:`make_archive` is not thread-safe.

   If given, *extra_args* is a sequence of ``(name, value)`` pairs that will be
   used as extra keywords arguments when the archiver callable is used.

   *description* is used by :func:`get_archive_formats` which returns the
   list of archivers.  Defaults to an empty string.

   .. versionchanged:: 3.12
      Added support for functions supporting the *root_dir* argument.


.. function:: unregister_archive_format(name)

   Remove the archive format *name* from the list of supported formats.


.. function:: unpack_archive(filename[, extract_dir[, format[, filter]]])

   Unpack an archive. *filename* is the full path of the archive.

   *extract_dir* is the name of the target directory where the archive is
   unpacked. If not provided, the current working directory is used.

   *format* is the archive format: one of "zip", "tar", "gztar", "bztar",
   "xztar", or "zstdtar".  Or any other format registered with
   :func:`register_unpack_format`.  If not provided, :func:`unpack_archive`
   will use the archive file name extension and see if an unpacker was
   registered for that extension.  In case none is found,
   a :exc:`ValueError` is raised.

   The keyword-only *filter* argument is passed to the underlying unpacking
   function. For zip files, *filter* is not accepted.
   For tar files, it is recommended to use ``'data'`` (default since Python
   3.14), unless using features specific to tar and UNIX-like filesystems.
   (See :ref:`tarfile-extraction-filter` for details.)

   .. audit-event:: shutil.unpack_archive filename,extract_dir,format shutil.unpack_archive

   .. warning::

      Never extract archives from untrusted sources without prior inspection.
      It is possible that files are created outside of the path specified in
      the *extract_dir* argument, e.g. members that have absolute filenames
      starting with "/" or filenames with two dots "..".

      Since Python 3.14, the defaults for both built-in formats (zip and tar
      files) will prevent the most dangerous of such security issues,
      but will not prevent *all* unintended behavior.
      Read the :ref:`tarfile-further-verification`
      section for tar-specific details.

   .. versionchanged:: 3.7
      Accepts a :term:`path-like object` for *filename* and *extract_dir*.

   .. versionchanged:: 3.12
      Added the *filter* argument.

.. function:: register_unpack_format(name, extensions, function[, extra_args[, description]])

   Registers an unpack format. *name* is the name of the format and
   *extensions* is a list of extensions corresponding to the format, like
   ``.zip`` for Zip files.

   *function* is the callable that will be used to unpack archives. The
   callable will receive:

   - the path of the archive, as a positional argument;
   - the directory the archive must be extracted to, as a positional argument;
   - possibly a *filter* keyword argument, if it was given to
     :func:`unpack_archive`;
   - additional keyword arguments, specified by *extra_args* as a sequence
     of ``(name, value)`` tuples.

   *description* can be provided to describe the format, and will be returned
   by the :func:`get_unpack_formats` function.


.. function:: unregister_unpack_format(name)

   Unregister an unpack format. *name* is the name of the format.


.. function:: get_unpack_formats()

   Return a list of all registered formats for unpacking.
   Each element of the returned sequence is a tuple
   ``(name, extensions, description)``.

   By default :mod:`shutil` provides these formats:

   - *zip*: ZIP file (unpacking compressed files works only if the corresponding
     module is available).
   - *tar*: uncompressed tar file.
   - *gztar*: gzip'ed tar-file (if the :mod:`zlib` module is available).
   - *bztar*: bzip2'ed tar-file (if the :mod:`bz2` module is available).
   - *xztar*: xz'ed tar-file (if the :mod:`lzma` module is available).
   - *zstdtar*: Zstandard compressed tar-file (if the :mod:`compression.zstd`
     module is available).

   You can register new formats or provide your own unpacker for any existing
   formats, by using :func:`register_unpack_format`.


.. _shutil-archiving-example:

Archiving example
~~~~~~~~~~~~~~~~~

In this example, we create a gzip'ed tar-file archive containing all files
found in the :file:`.ssh` directory of the user::

    >>> from shutil import make_archive
    >>> import os
    >>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
    >>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
    >>> make_archive(archive_name, 'gztar', root_dir)
    '/Users/tarek/myarchive.tar.gz'

The resulting archive contains:

.. code-block:: shell-session

    $ tar -tzvf /Users/tarek/myarchive.tar.gz
    drwx------ tarek/staff       0 2010-02-01 16:23:40 ./
    -rw-r--r-- tarek/staff     609 2008-06-09 13:26:54 ./authorized_keys
    -rwxr-xr-x tarek/staff      65 2008-06-09 13:26:54 ./config
    -rwx------ tarek/staff     668 2008-06-09 13:26:54 ./id_dsa
    -rwxr-xr-x tarek/staff     609 2008-06-09 13:26:54 ./id_dsa.pub
    -rw------- tarek/staff    1675 2008-06-09 13:26:54 ./id_rsa
    -rw-r--r-- tarek/staff     397 2008-06-09 13:26:54 ./id_rsa.pub
    -rw-r--r-- tarek/staff   37192 2010-02-06 18:23:10 ./known_hosts


.. _shutil-archiving-example-with-basedir:

Archiving example with *base_dir*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

In this example, similar to the `one above <shutil-archiving-example_>`_,
we show how to use :func:`make_archive`, but this time with the usage of
*base_dir*.  We now have the following directory structure:

.. code-block:: shell-session

    $ tree tmp
    tmp
    └── root
        └── structure
            ├── content
                └── please_add.txt
            └── do_not_add.txt

In the final archive, :file:`please_add.txt` should be included, but
:file:`do_not_add.txt` should not.  Therefore we use the following::

    >>> from shutil import make_archive
    >>> import os
    >>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
    >>> make_archive(
    ...     archive_name,
    ...     'tar',
    ...     root_dir='tmp/root',
    ...     base_dir='structure/content',
    ... )
    '/Users/tarek/myarchive.tar'

Listing the files in the resulting archive gives us:

.. code-block:: shell-session

    $ python -m tarfile -l /Users/tarek/myarchive.tar
    structure/content/
    structure/content/please_add.txt


Querying the size of the output terminal
----------------------------------------

.. function:: get_terminal_size(fallback=(columns, lines))

   Get the size of the terminal window.

   For each of the two dimensions, the environment variable, ``COLUMNS``
   and ``LINES`` respectively, is checked. If the variable is defined and
   the value is a positive integer, it is used.

   When ``COLUMNS`` or ``LINES`` is not defined, which is the common case,
   the terminal connected to :data:`sys.__stdout__` is queried
   by invoking :func:`os.get_terminal_size`.

   If the terminal size cannot be successfully queried, either because
   the system doesn't support querying, or because we are not
   connected to a terminal, the value given in ``fallback`` parameter
   is used. ``fallback`` defaults to ``(80, 24)`` which is the default
   size used by many terminal emulators.

   The value returned is a named tuple of type :class:`os.terminal_size`.

   See also: The Single UNIX Specification, Version 2,
   `Other Environment Variables`_.

   .. versionadded:: 3.3

   .. versionchanged:: 3.11
      The ``fallback`` values are also used if :func:`os.get_terminal_size`
      returns zeroes.

.. _`fcopyfile`:
   http://www.manpagez.com/man/3/copyfile/

.. _`Other Environment Variables`:
   https://pubs.opengroup.org/onlinepubs/7908799/xbd/envvar.html#tag_002_003
