shutil
— High-level file operations¶
Source code:Lib/shutil.py
Theshutil
module offers a number of high-level operations on files andcollections of files. In particular, functions are provided which support filecopying and removal. For operations on individual files, see also theos
module.
Warning
Even the higher-level file copying functions (shutil.copy()
,shutil.copy2()
) cannot copy all file metadata.
On POSIX platforms, this means that file owner and group are lost as wellas 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 willnot be correct. On Windows, file owners, ACLs and alternate data streamsare not copied.
Directory and files operations¶
- shutil.copyfileobj(fsrc,fdst[,length])¶
Copy the contents of thefile-like objectfsrc to the file-like objectfdst.The integerlength, if given, is the buffer size. In particular, a negativelength value means to copy the data without looping over the source data inchunks; by default the data is read in chunks to avoid uncontrolled memoryconsumption. Note that if the current file position of thefsrc object is not0, only the contents from the current file position to the end of the file willbe copied.
- shutil.copyfile(src,dst,*,follow_symlinks=True)¶
Copy the contents (no metadata) of the file namedsrc to a file nameddst and returndst in the most efficient way possible.src anddst arepath-like objects or path names given as strings.
dst must be the complete target file name; look at
copy()
for a copy that accepts a target directory path. Ifsrc anddstspecify the same file,SameFileError
is raised.The destination location must be writable; otherwise, an
OSError
exception will be raised. Ifdst already exists, it will be replaced.Special files such as character or block devices and pipes cannot becopied with this function.Iffollow_symlinks is false andsrc is a symbolic link,a new symbolic link will be created instead of copying thefilesrc points to.
Raises anauditing event
shutil.copyfile
with argumentssrc
,dst
.Changed in version 3.3:
IOError
used to be raised instead ofOSError
.Addedfollow_symlinks argument.Now returnsdst.Changed in version 3.4:Raise
SameFileError
instead ofError
. Since the former isa subclass of the latter, this change is backward compatible.Changed in version 3.8:Platform-specific fast-copy syscalls may be used internally in order tocopy the file more efficiently. SeePlatform-dependent efficient copy operations section.
- exceptionshutil.SameFileError¶
This exception is raised if source and destination in
copyfile()
are the same file.Added in version 3.4.
- shutil.copymode(src,dst,*,follow_symlinks=True)¶
Copy the permission bits fromsrc todst. The file contents, owner, andgroup are unaffected.src anddst arepath-like objects or path namesgiven as strings.Iffollow_symlinks is false, and bothsrc anddst are symbolic links,
copymode()
will attempt to modify the mode ofdst itself (ratherthan the file it points to). This functionality is not available on everyplatform; please seecopystat()
for more information. Ifcopymode()
cannot modify symbolic links on the local platform, and itis asked to do so, it will do nothing and return.Raises anauditing event
shutil.copymode
with argumentssrc
,dst
.Changed in version 3.3:Addedfollow_symlinks argument.
- shutil.copystat(src,dst,*,follow_symlinks=True)¶
Copy the permission bits, last access time, last modification time, andflags fromsrc todst. On Linux,
copystat()
also copies the“extended attributes” where possible. The file contents, owner, andgroup are unaffected.src anddst arepath-like objects or pathnames given as strings.Iffollow_symlinks is false, andsrc anddst bothrefer to symbolic links,
copystat()
will operate onthe symbolic links themselves rather than the files thesymbolic links refer to—reading the information from thesrc symbolic link, and writing the information to thedst symbolic link.Note
Not all platforms provide the ability to examine andmodify symbolic links. Python itself can tell you whatfunctionality is locally available.
If
os.chmodinos.supports_follow_symlinks
isTrue
,copystat()
can modify the permissionbits of a symbolic link.If
os.utimeinos.supports_follow_symlinks
isTrue
,copystat()
can modify the last accessand modification times of a symbolic link.If
os.chflagsinos.supports_follow_symlinks
isTrue
,copystat()
can modify the flags ofa symbolic link. (os.chflags
is not available onall platforms.)
On platforms where some or all of this functionalityis unavailable, when asked to modify a symbolic link,
copystat()
will copy everything it can.copystat()
never returns failure.Please see
os.supports_follow_symlinks
for more information.Raises anauditing event
shutil.copystat
with argumentssrc
,dst
.Changed in version 3.3:Addedfollow_symlinks argument and support for Linux extended attributes.
- shutil.copy(src,dst,*,follow_symlinks=True)¶
Copies the filesrc to the file or directorydst.src anddstshould bepath-like objects or strings. Ifdst specifies a directory, the file will be copied intodst using thebase filename fromsrc. Ifdst specifies a file that already exists,it will be replaced. Returns the path to the newly created file.
Iffollow_symlinks is false, andsrc is a symbolic link,dst will be created as a symbolic link. Iffollow_symlinksis true andsrc is a symbolic link,dst will be a copy ofthe filesrc refers to.
copy()
copies the file data and the file’s permissionmode (seeos.chmod()
). Other metadata, like thefile’s creation and modification times, is not preserved.To preserve all file metadata from the original, usecopy2()
instead.Raises anauditing event
shutil.copyfile
with argumentssrc
,dst
.Raises anauditing event
shutil.copymode
with argumentssrc
,dst
.Changed in version 3.3:Addedfollow_symlinks argument.Now returns path to the newly created file.
Changed in version 3.8:Platform-specific fast-copy syscalls may be used internally in order tocopy the file more efficiently. SeePlatform-dependent efficient copy operations section.
- shutil.copy2(src,dst,*,follow_symlinks=True)¶
Identical to
copy()
except thatcopy2()
also attempts to preserve file metadata.Whenfollow_symlinks is false, andsrc is a symboliclink,
copy2()
attempts to copy all metadata from thesrc symbolic link to the newly createddst symbolic link.However, this functionality is not available on all platforms.On platforms where some or all of this functionality isunavailable,copy2()
will preserve all the metadatait can;copy2()
never raises an exception because itcannot preserve file metadata.copy2()
usescopystat()
to copy the file metadata.Please seecopystat()
for more informationabout platform support for modifying symbolic link metadata.Raises anauditing event
shutil.copyfile
with argumentssrc
,dst
.Raises anauditing event
shutil.copystat
with argumentssrc
,dst
.Changed in version 3.3:Addedfollow_symlinks argument, try to copy extendedfile system attributes too (currently Linux only).Now returns path to the newly created file.
Changed in version 3.8:Platform-specific fast-copy syscalls may be used internally in order tocopy the file more efficiently. SeePlatform-dependent efficient copy operations section.
- shutil.ignore_patterns(*patterns)¶
This factory function creates a function that can be used as a callable for
copytree()
'signore argument, ignoring files and directories thatmatch one of the glob-stylepatterns provided. See the example below.
- shutil.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 atsrc to a directorynameddst and return the destination directory. All intermediatedirectories needed to containdst will also be created by default.
Permissions and times of directories are copied with
copystat()
,individual files are copied usingcopy2()
.Ifsymlinks is true, symbolic links in the source tree are represented assymbolic links in the new tree and the metadata of the original links willbe copied as far as the platform allows; if false or omitted, the contentsand metadata of the linked files are copied to the new tree.
Whensymlinks is false, if the file pointed to by the symlink doesn’texist, an exception will be added in the list of errors raised inan
Error
exception at the end of the copy process.You can set the optionalignore_dangling_symlinks flag to true if youwant to silence this exception. Notice that this option has no effecton platforms that don’t supportos.symlink()
.Ifignore is given, it must be a callable that will receive as itsarguments the directory being visited by
copytree()
, and a list of itscontents, as returned byos.listdir()
. Sincecopytree()
iscalled recursively, theignore callable will be called once for eachdirectory that is copied. The callable must return a sequence of directoryand file names relative to the current directory (i.e. a subset of the itemsin its second argument); these names will then be ignored in the copyprocess.ignore_patterns()
can be used to create such a callable thatignores names based on glob-style patterns.If exception(s) occur, an
Error
is raised with a list of reasons.Ifcopy_function is given, it must be a callable that will be used to copyeach file. It will be called with the source path and the destination pathas arguments. By default,
copy2()
is used, but any functionthat supports the same signature (likecopy()
) can be used.Ifdirs_exist_ok is false (the default) anddst already exists, a
FileExistsError
is raised. Ifdirs_exist_ok is true, the copyingoperation will continue if it encounters existing directories, and fileswithin thedst tree will be overwritten by corresponding files from thesrc tree.Raises anauditing event
shutil.copytree
with argumentssrc
,dst
.Changed in version 3.2:Added thecopy_function argument to be able to provide a custom copyfunction.Added theignore_dangling_symlinks argument to silence dangling symlinkserrors whensymlinks is false.
Changed in version 3.3:Copy metadata whensymlinks is false.Now returnsdst.
Changed in version 3.8:Platform-specific fast-copy syscalls may be used internally in order tocopy the file more efficiently. SeePlatform-dependent efficient copy operations section.
Changed in version 3.8:Added thedirs_exist_ok parameter.
- shutil.rmtree(path,ignore_errors=False,onerror=None,*,onexc=None,dir_fd=None)¶
Delete an entire directory tree;path must point to a directory (but not asymbolic link to a directory). Ifignore_errors is true, errors resultingfrom failed removals will be ignored; if false or omitted, such errors arehandled by calling a handler specified byonexc oronerror or, if bothare omitted, exceptions are propagated to the caller.
This function can supportpaths relative to directory descriptors.
Note
On platforms that support the necessary fd-based functions a symlinkattack resistant version of
rmtree()
is used by default. On otherplatforms, thermtree()
implementation is susceptible to a symlinkattack: given proper timing and circumstances, attackers can manipulatesymlinks on the filesystem to delete files they wouldn’t be able to accessotherwise. Applications can use thermtree.avoids_symlink_attacks
function attribute to determine which case applies.Ifonexc is provided, it must be a callable that accepts three parameters:function,path, andexcinfo.
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 tofunction. The third parameter,excinfo, is the exception that was raised. Exceptions raised byonexcwill not be caught.
The deprecatedonerror is similar toonexc, except that the thirdparameter it receives is the tuple returned from
sys.exc_info()
.Raises anauditing event
shutil.rmtree
with argumentspath
,dir_fd
.Changed in version 3.3:Added a symlink attack resistant version that is used automaticallyif platform supports fd-based functions.
Changed in version 3.8:On Windows, will no longer delete the contents of a directory junctionbefore removing the junction.
Changed in version 3.11:Added thedir_fd parameter.
Changed in version 3.12:Added theonexc parameter, deprecatedonerror.
Changed in version 3.13:
rmtree()
now ignoresFileNotFoundError
exceptions for allbut the top-level path.Exceptions other thanOSError
and subclasses ofOSError
are now always propagated to the caller.
- shutil.move(src,dst,copy_function=copy2)¶
Recursively move a file or directory (src) to another location and returnthe destination.
Ifdst is an existing directory or a symlink to a directory, thensrcis moved inside that directory. The destination path in that directory mustnot already exist.
Ifdst already exists but is not a directory, it may be overwrittendepending on
os.rename()
semantics.If the destination is on the current filesystem, then
os.rename()
isused. Otherwise,src is copied to the destination usingcopy_functionand then removed. In case of symlinks, a new symlink pointing to the targetofsrc will be created as the destination andsrc will be removed.Ifcopy_function is given, it must be a callable that takes two arguments,src and the destination, and will be used to copysrc to the destinationif
os.rename()
cannot be used. If the source is a directory,copytree()
is called, passing it thecopy_function. Thedefaultcopy_function iscopy2()
. Usingcopy()
as thecopy_function allows the move to succeed when it is not possible to alsocopy the metadata, at the expense of not copying any of the metadata.Raises anauditing event
shutil.move
with argumentssrc
,dst
.Changed in version 3.3:Added explicit symlink handling for foreign filesystems, thus adaptingit to the behavior of GNU’smv.Now returnsdst.
Changed in version 3.5:Added thecopy_function keyword argument.
Changed in version 3.8:Platform-specific fast-copy syscalls may be used internally in order tocopy the file more efficiently. SeePlatform-dependent efficient copy operations section.
Changed in version 3.9:Accepts apath-like object for bothsrc anddst.
- shutil.disk_usage(path)¶
Return disk usage statistics about the given path as anamed tuplewith the attributestotal,used andfree, which are the amount oftotal, used and free space, in bytes.path may be a file or adirectory.
Note
On Unix filesystems,path must point to a path within amountedfilesystem partition. On those platforms, CPython doesn’t attempt toretrieve disk usage information from non-mounted filesystems.
Added in version 3.3.
Changed in version 3.8:On Windows,path can now be a file or directory.
Availability: Unix, Windows.
- shutil.chown(path,user=None,group=None,*,dir_fd=None,follow_symlinks=True)¶
Change owneruser and/orgroup of the givenpath.
user can be a system user name or a uid; the same applies togroup. Atleast one argument is required.
See also
os.chown()
, the underlying function.Raises anauditing event
shutil.chown
with argumentspath
,user
,group
.Availability: Unix.
Added in version 3.3.
Changed in version 3.13:Addeddir_fd andfollow_symlinks parameters.
- shutil.which(cmd,mode=os.F_OK|os.X_OK,path=None)¶
Return the path to an executable which would be run if the givencmd wascalled. If nocmd would be called, return
None
.mode is a permission mask passed to
os.access()
, by defaultdetermining if the file exists and is executable.path is a “
PATH
string” specifying the directories to look in,delimited byos.pathsep
. When nopath is specified, thePATH
environment variable is read fromos.environ
,falling back toos.defpath
if it is not set.Ifcmd contains a directory component,
which()
only checks thespecified path directly and does not search the directories listed inpath or in the system’sPATH
environment variable.On Windows, the current directory is prepended to thepath ifmode doesnot include
os.X_OK
. When themode does includeos.X_OK
, theWindows APINeedCurrentDirectoryForExePathW
will be consulted todetermine if the current directory should be prepended topath. To avoidconsulting the current working directory for executables: set the environmentvariableNoDefaultCurrentDirectoryInExePath
.Also on Windows, the
PATHEXT
environment variable is used toresolve commands that may not already include an extension. For example,if you callshutil.which("python")
,which()
will searchPATHEXT
to know that it should look forpython.exe
within thepathdirectories. For example, on Windows:>>>shutil.which("python")'C:\\Python33\\python.EXE'
This is also applied whencmd is a path that contains a directorycomponent:
>>>shutil.which("C:\\Python33\\python")'C:\\Python33\\python.EXE'
Added in version 3.3.
Changed in version 3.8:The
bytes
type is now accepted. Ifcmd type isbytes
, the result type is alsobytes
.Changed in version 3.12:On Windows, the current directory is no longer prepended to the searchpath ifmode includes
os.X_OK
and WinAPINeedCurrentDirectoryForExePathW(cmd)
is false, else the currentdirectory is prepended even if it is already in the search path;PATHEXT
is used now even whencmd includes a directory componentor ends with an extension that is inPATHEXT
; and filenames thathave no extension can now be found.
- exceptionshutil.Error¶
This exception collects exceptions that are raised during a multi-fileoperation. For
copytree()
, the exception argument is a list of 3-tuples(srcname,dstname,exception).
Platform-dependent efficient copy operations¶
Starting from Python 3.8, all functions involving a file copy(copyfile()
,copy()
,copy2()
,copytree()
, andmove()
) may useplatform-specific “fast-copy” syscalls in order to copy the file moreefficiently (seebpo-33671).“fast-copy” means that the copying operation occurs within the kernel, avoidingthe use of userspace buffers in Python as in “outfd.write(infd.read())
”.
On macOSfcopyfile is used to copy the file content (not metadata).
On Linuxos.sendfile()
is used.
On Windowsshutil.copyfile()
uses a bigger default buffer size (1 MiBinstead of 64 KiB) and amemoryview()
-based variant ofshutil.copyfileobj()
is used.
If the fast-copy operation fails and no data was written in the destinationfile then shutil will silently fallback on using less efficientcopyfileobj()
function internally.
Changed in version 3.8.
copytree example¶
An example that uses theignore_patterns()
helper:
fromshutilimportcopytree,ignore_patternscopytree(source,destination,ignore=ignore_patterns('*.pyc','tmp*'))
This will copy everything except.pyc
files and files or directories whosename starts withtmp
.
Another example that uses theignore argument to add a logging call:
fromshutilimportcopytreeimportloggingdef_logpath(path,names):logging.info('Working in%s',path)return[]# nothing will be ignoredcopytree(source,destination,ignore=_logpath)
rmtree example¶
This example shows how to remove a directory tree on Windows where someof the files have their read-only bit set. It uses the onexc callbackto clear the readonly bit and reattempt the remove. Any subsequent failurewill propagate.
importos,statimportshutildefremove_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¶
Added in version 3.2.
Changed in version 3.5:Added support for thexztar format.
High-level utilities to create and read compressed and archived files are alsoprovided. They rely on thezipfile
andtarfile
modules.
- shutil.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, minusany format-specific extension.
format is the archive format: one of“zip” (if the
zlib
module is available), “tar”, “gztar” (if thezlib
module is available), “bztar” (if thebz2
module isavailable), or “xztar” (if thelzma
module is available).root_dir is a directory that will be the root directory of thearchive, all paths in the archive will be relative to it; for example,we typically chdir intoroot_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 anddirectories in the archive.base_dir must be given relativetoroot_dir. SeeArchiving example with base_dir for how tousebase_dir androot_dir together.
root_dir andbase_dir both default to the current directory.
Ifdry_run is true, no archive is created, but the operations that would beexecuted are logged tologger.
owner andgroup are used when creating a tar archive. By default,uses the current owner and group.
logger must be an object compatible withPEP 282, usually an instance of
logging.Logger
.Theverbose argument is unused and deprecated.
Raises anauditing event
shutil.make_archive
with argumentsbase_name
,format
,root_dir
,base_dir
.Note
This function is not thread-safe when custom archivers registeredwith
register_archive_format()
do not support theroot_dirargument. In this case ittemporarily changes the current working directory of the processtoroot_dir to perform archiving.Changed in version 3.8:The modern pax (POSIX.1-2001) format is now used instead ofthe legacy GNU format for archives created with
format="tar"
.Changed in version 3.10.6:This function is now made thread-safe during creation of standard
.zip
and tar archives.
- shutil.get_archive_formats()¶
Return a list of supported formats for archiving.Each element of the returned sequence is a tuple
(name,description)
.By default
shutil
provides these formats:zip: ZIP file (if the
zlib
module is available).tar: Uncompressed tar file. Uses POSIX.1-2001 pax format for new archives.
gztar: gzip’ed tar-file (if the
zlib
module is available).bztar: bzip2’ed tar-file (if the
bz2
module is available).xztar: xz’ed tar-file (if the
lzma
module is available).
You can register new formats or provide your own archiver for any existingformats, by using
register_archive_format()
.
- shutil.register_archive_format(name,function[,extra_args[,description]])¶
Register an archiver for the formatname.
function is the callable that will be used to unpack archives. The callablewill receive thebase_name of the file to create, followed by thebase_dir (which defaults to
os.curdir
) to start archiving from.Further arguments are passed as keyword arguments:owner,group,dry_run andlogger (as passed inmake_archive()
).Iffunction has the custom attribute
function.supports_root_dir
set toTrue
,theroot_dir argument is passed as a keyword argument.Otherwise the current working directory of the process is temporarilychanged toroot_dir before callingfunction.In this casemake_archive()
is not thread-safe.If given,extra_args is a sequence of
(name,value)
pairs that will beused as extra keywords arguments when the archiver callable is used.description is used by
get_archive_formats()
which returns thelist of archivers. Defaults to an empty string.Changed in version 3.12:Added support for functions supporting theroot_dir argument.
- shutil.unregister_archive_format(name)¶
Remove the archive formatname from the list of supported formats.
- shutil.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 isunpacked. If not provided, the current working directory is used.
format is the archive format: one of “zip”, “tar”, “gztar”, “bztar”, or“xztar”. Or any other format registered with
register_unpack_format()
. If not provided,unpack_archive()
will use the archive file name extension and see if an unpacker wasregistered for that extension. In case none is found,aValueError
is raised.The keyword-onlyfilter argument is passed to the underlying unpackingfunction. For zip files,filter is not accepted.For tar files, it is recommended to set it to
'data'
,unless using features specific to tar and UNIX-like filesystems.(SeeExtraction filters for details.)The'data'
filter will become the default for tar filesin Python 3.14.Raises anauditing event
shutil.unpack_archive
with argumentsfilename
,extract_dir
,format
.Warning
Never extract archives from untrusted sources without prior inspection.It is possible that files are created outside of the path specified intheextract_dir argument, e.g. members that have absolute filenamesstarting with “/” or filenames with two dots “..”.
Changed in version 3.7:Accepts apath-like object forfilename andextract_dir.
Changed in version 3.12:Added thefilter argument.
- shutil.register_unpack_format(name,extensions,function[,extra_args[,description]])¶
Registers an unpack format.name is the name of the format andextensions 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. Thecallable will receive:
the path of the archive, as a positional argument;
the directory the archive must be extracted to, as a positional argument;
possibly afilter keyword argument, if it was given to
unpack_archive()
;additional keyword arguments, specified byextra_args as a sequenceof
(name,value)
tuples.
description can be provided to describe the format, and will be returnedby the
get_unpack_formats()
function.
- shutil.unregister_unpack_format(name)¶
Unregister an unpack format.name is the name of the format.
- shutil.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
shutil
provides these formats:zip: ZIP file (unpacking compressed files works only if the correspondingmodule is available).
tar: uncompressed tar file.
gztar: gzip’ed tar-file (if the
zlib
module is available).bztar: bzip2’ed tar-file (if the
bz2
module is available).xztar: xz’ed tar-file (if the
lzma
module is available).
You can register new formats or provide your own unpacker for any existingformats, by using
register_unpack_format()
.
Archiving example¶
In this example, we create a gzip’ed tar-file archive containing all filesfound in the.ssh
directory of the user:
>>>fromshutilimportmake_archive>>>importos>>>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:
$tar-tzvf/Users/tarek/myarchive.tar.gzdrwx------ 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
Archiving example withbase_dir¶
In this example, similar to theone above,we show how to usemake_archive()
, but this time with the usage ofbase_dir. We now have the following directory structure:
$treetmptmp└── root └── structure ├── content └── please_add.txt └── do_not_add.txt
In the final archive,please_add.txt
should be included, butdo_not_add.txt
should not. Therefore we use the following:
>>>fromshutilimportmake_archive>>>importos>>>archive_name=os.path.expanduser(os.path.join('~','myarchive'))>>>make_archive(...archive_name,...'tar',...root_dir='tmp/root',...base_dir='structure/content',...)'/Users/tarek/my_archive.tar'
Listing the files in the resulting archive gives us:
$python-mtarfile-l/Users/tarek/myarchive.tarstructure/content/structure/content/please_add.txt
Querying the size of the output terminal¶
- shutil.get_terminal_size(fallback=(columns,lines))¶
Get the size of the terminal window.
For each of the two dimensions, the environment variable,
COLUMNS
andLINES
respectively, is checked. If the variable is defined andthe value is a positive integer, it is used.When
COLUMNS
orLINES
is not defined, which is the common case,the terminal connected tosys.__stdout__
is queriedby invokingos.get_terminal_size()
.If the terminal size cannot be successfully queried, either becausethe system doesn’t support querying, or because we are notconnected to a terminal, the value given in
fallback
parameteris used.fallback
defaults to(80,24)
which is the defaultsize used by many terminal emulators.The value returned is a named tuple of type
os.terminal_size
.See also: The Single UNIX Specification, Version 2,Other Environment Variables.
Added in version 3.3.
Changed in version 3.11:The
fallback
values are also used ifos.get_terminal_size()
returns zeroes.