blob: 1bc5c71fd03494477130e33e285a645e9d479e34 [file] [log] [blame]
Guido van Rossum0e548712002-08-09 16:14:33 +00001"""Temporary files.
Guido van Rossume7b146f2000-02-04 15:28:42 +00002
Guido van Rossum0e548712002-08-09 16:14:33 +00003This module provides generic, low- and high-level interfaces for
Yury Selivanov0b866602014-09-26 17:08:21 -04004creating temporary files and directories. All of the interfaces
5provided by this module can be used without fear of race conditions
6except for 'mktemp'. 'mktemp' is subject to race conditions and
7should not be used; it is provided for backward compatibility only.
Guido van Rossumeee94981991-11-12 15:38:08 +00008
Gregory P. Smithad577b92015-05-22 16:18:14 -07009The default path names are returned as str. If you supply bytes as
10input, all return values will be in bytes. Ex:
11
12 >>> tempfile.mkstemp()
13 (4, '/tmp/tmptpu9nin8')
14 >>> tempfile.mkdtemp(suffix=b'')
15 b'/tmp/tmppbi8f0hy'
16
Guido van Rossum0e548712002-08-09 16:14:33 +000017This module also provides some data items to the user:
Guido van Rossumeee94981991-11-12 15:38:08 +000018
Guido van Rossum0e548712002-08-09 16:14:33 +000019 TMP_MAX - maximum number of names that will be tried before
20 giving up.
Guido van Rossum0e548712002-08-09 16:14:33 +000021 tempdir - If this is set to a string before the first use of
22 any routine from this module, it will be considered as
23 another candidate location to store temporary files.
24"""
Skip Montanaro40fc1602001-03-01 04:27:19 +000025
Guido van Rossum0e548712002-08-09 16:14:33 +000026__all__ = [
27 "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces
Nick Coghlan543af752010-10-24 11:23:25 +000028 "SpooledTemporaryFile", "TemporaryDirectory",
Guido van Rossum0e548712002-08-09 16:14:33 +000029 "mkstemp", "mkdtemp", # low level safe interfaces
30 "mktemp", # deprecated unsafe interface
31 "TMP_MAX", "gettempprefix", # constants
Gregory P. Smithad577b92015-05-22 16:18:14 -070032 "tempdir", "gettempdir",
33 "gettempprefixb", "gettempdirb",
Guido van Rossum0e548712002-08-09 16:14:33 +000034 ]
Guido van Rossum41f95031992-03-31 19:02:01 +000035
Tim Peters4fd5a062002-01-28 23:11:23 +000036
Guido van Rossum0e548712002-08-09 16:14:33 +000037# Imports.
Tim Peters4fd5a062002-01-28 23:11:23 +000038
Antoine Pitrou17c93262013-12-21 22:14:56 +010039import functools as _functools
Nick Coghlan6b22f3f2010-12-12 15:24:21 +000040import warnings as _warnings
Guido van Rossum9a634702007-07-09 10:24:45 +000041import io as _io
Guido van Rossum0e548712002-08-09 16:14:33 +000042import os as _os
Serhiy Storchaka99e033b2014-01-27 11:18:27 +020043import shutil as _shutil
Serhiy Storchaka7451a722013-02-09 22:25:49 +020044import errno as _errno
Guido van Rossum0e548712002-08-09 16:14:33 +000045from random import Random as _Random
Steve Dower60419a72019-06-24 08:42:54 -070046import sys as _sys
Guido van Rossum48b069a2020-04-07 09:50:06 -070047import types as _types
Serhiy Storchakaa28632b2014-01-27 11:21:54 +020048import weakref as _weakref
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020049import _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000050_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000051
52_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000053if hasattr(_os, 'O_NOFOLLOW'):
54 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000055
56_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000057if hasattr(_os, 'O_BINARY'):
58 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000059
60if hasattr(_os, 'TMP_MAX'):
61 TMP_MAX = _os.TMP_MAX
62else:
63 TMP_MAX = 10000
64
Gregory P. Smithad577b92015-05-22 16:18:14 -070065# This variable _was_ unused for legacy reasons, see issue 10354.
66# But as of 3.5 we actually use it at runtime so changing it would
67# have a possibly desirable side effect... But we do not want to support
68# that as an API. It is undocumented on purpose. Do not depend on this.
Tim Petersbd7b4c72002-08-13 23:33:56 +000069template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000070
Guido van Rossum0e548712002-08-09 16:14:33 +000071# Internal routines.
72
73_once_lock = _allocate_lock()
74
Guido van Rossumb256159392003-11-10 02:16:36 +000075
76def _exists(fn):
77 try:
Anthony Sottile8377cd42019-02-25 14:32:27 -080078 _os.lstat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020079 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +000080 return False
81 else:
82 return True
83
Gregory P. Smithad577b92015-05-22 16:18:14 -070084
85def _infer_return_type(*args):
86 """Look at the type of all args and divine their implied return type."""
87 return_type = None
88 for arg in args:
89 if arg is None:
90 continue
91 if isinstance(arg, bytes):
92 if return_type is str:
93 raise TypeError("Can't mix bytes and non-bytes in "
94 "path components.")
95 return_type = bytes
96 else:
97 if return_type is bytes:
98 raise TypeError("Can't mix bytes and non-bytes in "
99 "path components.")
100 return_type = str
101 if return_type is None:
102 return str # tempfile APIs return a str by default.
103 return return_type
104
105
106def _sanitize_params(prefix, suffix, dir):
107 """Common parameter processing for most APIs in this module."""
108 output_type = _infer_return_type(prefix, suffix, dir)
109 if suffix is None:
110 suffix = output_type()
111 if prefix is None:
112 if output_type is str:
113 prefix = template
114 else:
115 prefix = _os.fsencode(template)
116 if dir is None:
117 if output_type is str:
118 dir = gettempdir()
119 else:
120 dir = gettempdirb()
121 return prefix, suffix, dir, output_type
122
123
Victor Stinner1e62bf12017-04-19 22:59:51 +0200124class _RandomNameSequence:
125 """An instance of _RandomNameSequence generates an endless
126 sequence of unpredictable strings which can safely be incorporated
Wolfgang Maier9c463ec2018-04-09 02:42:39 +0200127 into file names. Each string is eight characters long. Multiple
Victor Stinner1e62bf12017-04-19 22:59:51 +0200128 threads can safely use the same instance at the same time.
129
130 _RandomNameSequence is an iterator."""
Guido van Rossum0e548712002-08-09 16:14:33 +0000131
Eric W8e409ce2020-10-30 05:56:28 +0100132 def __init__(self, characters="abcdefghijklmnopqrstuvwxyz0123456789_", length=8, rng=None):
133 if rng is None:
134 rng = _Random()
135 if hasattr(_os, "fork"):
136 # prevent same state after fork
137 _os.register_at_fork(after_in_child=rng.seed)
138 self.rng = rng
139 self.characters = characters
140 self.length = length
Victor Stinner1e62bf12017-04-19 22:59:51 +0200141
142 def __iter__(self):
143 return self
144
145 def __next__(self):
146 c = self.characters
Eric W8e409ce2020-10-30 05:56:28 +0100147 return ''.join(self.rng.choices(c, k=self.length))
Guido van Rossum0e548712002-08-09 16:14:33 +0000148
149def _candidate_tempdir_list():
150 """Generate a list of candidate temporary directories which
151 _get_default_tempdir will try."""
152
153 dirlist = []
154
155 # First, try the environment.
156 for envname in 'TMPDIR', 'TEMP', 'TMP':
157 dirname = _os.getenv(envname)
158 if dirname: dirlist.append(dirname)
159
160 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000161 if _os.name == 'nt':
Steve Dowere5f41d22018-05-16 17:50:29 -0400162 dirlist.extend([ _os.path.expanduser(r'~\AppData\Local\Temp'),
163 _os.path.expandvars(r'%SYSTEMROOT%\Temp'),
164 r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
Guido van Rossum0e548712002-08-09 16:14:33 +0000165 else:
166 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
167
168 # As a last resort, the current directory.
169 try:
170 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200171 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000172 dirlist.append(_os.curdir)
173
174 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000175
Guido van Rossum0e548712002-08-09 16:14:33 +0000176def _get_default_tempdir():
177 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000178 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000179
180 We determine whether or not a candidate temp dir is usable by
181 trying to create and write to a file in that directory. If this
182 is successful, the test file is deleted. To prevent denial of
183 service, the name of the test file must be randomized."""
184
185 namer = _RandomNameSequence()
186 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000187
188 for dir in dirlist:
189 if dir != _os.curdir:
Tim Golden6d09f092013-10-25 18:38:16 +0100190 dir = _os.path.abspath(dir)
Guido van Rossum0e548712002-08-09 16:14:33 +0000191 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000192 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000193 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000194 filename = _os.path.join(dir, name)
195 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000196 fd = _os.open(filename, _bin_openflags, 0o600)
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200197 try:
198 try:
Serhiy Storchaka76a2ed12013-02-13 00:59:26 +0200199 with _io.open(fd, 'wb', closefd=False) as fp:
200 fp.write(b'blat')
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200201 finally:
202 _os.close(fd)
203 finally:
204 _os.unlink(filename)
Guido van Rossum0e548712002-08-09 16:14:33 +0000205 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200206 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000207 pass
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300208 except PermissionError:
209 # This exception is thrown when a directory with the chosen name
210 # already exists on windows.
211 if (_os.name == 'nt' and _os.path.isdir(dir) and
212 _os.access(dir, _os.W_OK)):
213 continue
214 break # no point trying more names in this directory
Florent Xicluna68f71a32011-10-28 16:06:23 +0200215 except OSError:
216 break # no point trying more names in this directory
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200217 raise FileNotFoundError(_errno.ENOENT,
218 "No usable temporary directory found in %s" %
219 dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000220
Guido van Rossume888cdc2002-08-17 14:50:24 +0000221_name_sequence = None
222
Guido van Rossum0e548712002-08-09 16:14:33 +0000223def _get_candidate_names():
224 """Common setup sequence for all user-callable interfaces."""
225
Guido van Rossume888cdc2002-08-17 14:50:24 +0000226 global _name_sequence
227 if _name_sequence is None:
228 _once_lock.acquire()
229 try:
230 if _name_sequence is None:
231 _name_sequence = _RandomNameSequence()
232 finally:
233 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000234 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000235
236
Gregory P. Smithad577b92015-05-22 16:18:14 -0700237def _mkstemp_inner(dir, pre, suf, flags, output_type):
Guido van Rossum0e548712002-08-09 16:14:33 +0000238 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000239
Guido van Rossum0e548712002-08-09 16:14:33 +0000240 names = _get_candidate_names()
Gregory P. Smithad577b92015-05-22 16:18:14 -0700241 if output_type is bytes:
242 names = map(_os.fsencode, names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000243
Guido van Rossum805365e2007-05-07 22:24:25 +0000244 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000245 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000246 file = _os.path.join(dir, pre + name + suf)
Steve Dower60419a72019-06-24 08:42:54 -0700247 _sys.audit("tempfile.mkstemp", file)
Guido van Rossum0e548712002-08-09 16:14:33 +0000248 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000249 fd = _os.open(file, flags, 0o600)
Florent Xicluna68f71a32011-10-28 16:06:23 +0200250 except FileExistsError:
251 continue # try again
Eli Benderskyf315df32013-09-06 06:11:19 -0700252 except PermissionError:
253 # This exception is thrown when a directory with the chosen name
254 # already exists on windows.
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300255 if (_os.name == 'nt' and _os.path.isdir(dir) and
256 _os.access(dir, _os.W_OK)):
Eli Benderskyf315df32013-09-06 06:11:19 -0700257 continue
258 else:
259 raise
Gregory P. Smithad577b92015-05-22 16:18:14 -0700260 return (fd, _os.path.abspath(file))
Guido van Rossum0e548712002-08-09 16:14:33 +0000261
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200262 raise FileExistsError(_errno.EEXIST,
263 "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000264
Guido van Rossum0e548712002-08-09 16:14:33 +0000265
266# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000267
Guido van Rossum41f95031992-03-31 19:02:01 +0000268def gettempprefix():
Gregory P. Smithad577b92015-05-22 16:18:14 -0700269 """The default prefix for temporary directories."""
Guido van Rossum0e548712002-08-09 16:14:33 +0000270 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000271
Gregory P. Smithad577b92015-05-22 16:18:14 -0700272def gettempprefixb():
273 """The default prefix for temporary directories as bytes."""
274 return _os.fsencode(gettempprefix())
275
Guido van Rossume888cdc2002-08-17 14:50:24 +0000276tempdir = None
277
Guido van Rossum0e548712002-08-09 16:14:33 +0000278def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000279 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000280 global tempdir
281 if tempdir is None:
282 _once_lock.acquire()
283 try:
284 if tempdir is None:
285 tempdir = _get_default_tempdir()
286 finally:
287 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000288 return tempdir
289
Gregory P. Smithad577b92015-05-22 16:18:14 -0700290def gettempdirb():
291 """A bytes version of tempfile.gettempdir()."""
292 return _os.fsencode(gettempdir())
293
294def mkstemp(suffix=None, prefix=None, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000295 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000296 file. The return value is a pair (fd, name) where fd is the
297 file descriptor returned by os.open, and name is the filename.
298
Martin Panter9b566c32015-11-07 00:32:50 +0000299 If 'suffix' is not None, the file name will end with that suffix,
Guido van Rossum0e548712002-08-09 16:14:33 +0000300 otherwise there will be no suffix.
301
Martin Panter9b566c32015-11-07 00:32:50 +0000302 If 'prefix' is not None, the file name will begin with that prefix,
Guido van Rossum0e548712002-08-09 16:14:33 +0000303 otherwise a default prefix is used.
304
Martin Panter9b566c32015-11-07 00:32:50 +0000305 If 'dir' is not None, the file will be created in that directory,
Guido van Rossum0e548712002-08-09 16:14:33 +0000306 otherwise a default directory is used.
307
Tim Peters04490bf2002-08-14 15:41:26 +0000308 If 'text' is specified and true, the file is opened in text
Rishav Kundue55de682020-08-14 07:03:14 +0530309 mode. Else (the default) the file is opened in binary mode.
Guido van Rossum0e548712002-08-09 16:14:33 +0000310
Martin Panter9b566c32015-11-07 00:32:50 +0000311 If any of 'suffix', 'prefix' and 'dir' are not None, they must be the
312 same type. If they are bytes, the returned name will be bytes; str
313 otherwise.
Gregory P. Smithad577b92015-05-22 16:18:14 -0700314
Guido van Rossum0e548712002-08-09 16:14:33 +0000315 The file is readable and writable only by the creating user ID.
316 If the operating system uses permission bits to indicate whether a
317 file is executable, the file is executable by no one. The file
318 descriptor is not inherited by children of this process.
319
320 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000321 """
322
Gregory P. Smithad577b92015-05-22 16:18:14 -0700323 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000324
Tim Peters04490bf2002-08-14 15:41:26 +0000325 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000326 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000327 else:
328 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000329
Gregory P. Smithad577b92015-05-22 16:18:14 -0700330 return _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Guido van Rossumcff34541992-01-14 18:31:56 +0000331
Guido van Rossumeee94981991-11-12 15:38:08 +0000332
Gregory P. Smithad577b92015-05-22 16:18:14 -0700333def mkdtemp(suffix=None, prefix=None, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000334 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000335 directory. The return value is the pathname of the directory.
336
Tim Peters04490bf2002-08-14 15:41:26 +0000337 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000338 not accepted.
339
340 The directory is readable, writable, and searchable only by the
341 creating user.
342
343 Caller is responsible for deleting the directory when done with it.
344 """
345
Gregory P. Smithad577b92015-05-22 16:18:14 -0700346 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000347
Guido van Rossum0e548712002-08-09 16:14:33 +0000348 names = _get_candidate_names()
Gregory P. Smithad577b92015-05-22 16:18:14 -0700349 if output_type is bytes:
350 names = map(_os.fsencode, names)
Tim Petersa0d55de2002-08-09 18:01:01 +0000351
Guido van Rossum805365e2007-05-07 22:24:25 +0000352 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000353 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000354 file = _os.path.join(dir, prefix + name + suffix)
Steve Dower60419a72019-06-24 08:42:54 -0700355 _sys.audit("tempfile.mkdtemp", file)
Guido van Rossum0e548712002-08-09 16:14:33 +0000356 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000357 _os.mkdir(file, 0o700)
Florent Xicluna68f71a32011-10-28 16:06:23 +0200358 except FileExistsError:
359 continue # try again
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300360 except PermissionError:
361 # This exception is thrown when a directory with the chosen name
362 # already exists on windows.
363 if (_os.name == 'nt' and _os.path.isdir(dir) and
364 _os.access(dir, _os.W_OK)):
365 continue
366 else:
367 raise
Gregory P. Smithad577b92015-05-22 16:18:14 -0700368 return file
Guido van Rossum0e548712002-08-09 16:14:33 +0000369
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200370 raise FileExistsError(_errno.EEXIST,
371 "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000372
Guido van Rossume888cdc2002-08-17 14:50:24 +0000373def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000374 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000375 file is not created.
376
Martin Panter9b566c32015-11-07 00:32:50 +0000377 Arguments are similar to mkstemp, except that the 'text' argument is
378 not accepted, and suffix=None, prefix=None and bytes file names are not
379 supported.
Guido van Rossum0e548712002-08-09 16:14:33 +0000380
Gregory P. Smithad577b92015-05-22 16:18:14 -0700381 THIS FUNCTION IS UNSAFE AND SHOULD NOT BE USED. The file name may
382 refer to a file that did not exist at some point, but by the time
Guido van Rossum0e548712002-08-09 16:14:33 +0000383 you get around to creating it, someone else may have beaten you to
384 the punch.
385 """
386
Guido van Rossum44f602d2002-11-22 15:56:29 +0000387## from warnings import warn as _warn
388## _warn("mktemp is a potential security risk to your program",
389## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000390
Guido van Rossume888cdc2002-08-17 14:50:24 +0000391 if dir is None:
392 dir = gettempdir()
393
Guido van Rossum0e548712002-08-09 16:14:33 +0000394 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000395 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000396 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000397 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000398 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000399 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000400
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200401 raise FileExistsError(_errno.EEXIST,
402 "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000403
Christian Heimes3ecfea712008-02-09 20:51:34 +0000404
Antoine Pitrou17c93262013-12-21 22:14:56 +0100405class _TemporaryFileCloser:
406 """A separate object allowing proper closing of a temporary file's
407 underlying file object, without adding a __del__ method to the
408 temporary file."""
Tim Petersa255a722001-12-18 22:32:40 +0000409
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200410 file = None # Set here since __del__ checks it
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200411 close_called = False
412
Guido van Rossumd8faa362007-04-27 19:54:29 +0000413 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000414 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000415 self.name = name
Guido van Rossumd8faa362007-04-27 19:54:29 +0000416 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000417
Guido van Rossum0e548712002-08-09 16:14:33 +0000418 # NT provides delete-on-close as a primitive, so we don't need
419 # the wrapper to do anything special. We still use it so that
420 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
421 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000422 # Cache the unlinker so we don't get spurious errors at
423 # shutdown when the module-level "os" is None'd out. Note
424 # that this must be referenced as self.unlink, because the
425 # name TemporaryFileWrapper may also get None'd out before
426 # __del__ is called.
Tim Peters1baa22af2001-01-12 10:02:46 +0000427
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200428 def close(self, unlink=_os.unlink):
429 if not self.close_called and self.file is not None:
Tim Peters6ef966e2002-11-21 15:48:33 +0000430 self.close_called = True
Serhiy Storchaka7e7a3db2015-04-10 13:24:41 +0300431 try:
432 self.file.close()
433 finally:
434 if self.delete:
435 unlink(self.name)
Tim Peters1baa22af2001-01-12 10:02:46 +0000436
Antoine Pitrou17c93262013-12-21 22:14:56 +0100437 # Need to ensure the file is deleted on __del__
Guido van Rossum0e548712002-08-09 16:14:33 +0000438 def __del__(self):
439 self.close()
Tim Peters1baa22af2001-01-12 10:02:46 +0000440
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000441 else:
Antoine Pitrou17c93262013-12-21 22:14:56 +0100442 def close(self):
443 if not self.close_called:
444 self.close_called = True
445 self.file.close()
446
447
448class _TemporaryFileWrapper:
449 """Temporary file wrapper
450
451 This class provides a wrapper around files opened for
452 temporary use. In particular, it seeks to automatically
453 remove the file when it is no longer needed.
454 """
455
456 def __init__(self, file, name, delete=True):
457 self.file = file
458 self.name = name
459 self.delete = delete
460 self._closer = _TemporaryFileCloser(file, name, delete)
461
462 def __getattr__(self, name):
463 # Attribute lookups are delegated to the underlying file
464 # and cached for non-numeric results
465 # (i.e. methods are cached, closed and friends are not)
466 file = self.__dict__['file']
467 a = getattr(file, name)
468 if hasattr(a, '__call__'):
469 func = a
470 @_functools.wraps(func)
471 def func_wrapper(*args, **kwargs):
472 return func(*args, **kwargs)
473 # Avoid closing the file as long as the wrapper is alive,
474 # see issue #18879.
475 func_wrapper._closer = self._closer
476 a = func_wrapper
477 if not isinstance(a, int):
478 setattr(self, name, a)
479 return a
480
481 # The underlying __enter__ method returns the wrong object
482 # (self.file) so override it to return the wrapper
483 def __enter__(self):
484 self.file.__enter__()
485 return self
486
487 # Need to trap __exit__ as well to ensure the file gets
488 # deleted when used in a with statement
489 def __exit__(self, exc, value, tb):
490 result = self.file.__exit__(exc, value, tb)
491 self.close()
492 return result
493
494 def close(self):
495 """
496 Close the temporary file, possibly deleting it.
497 """
498 self._closer.close()
499
500 # iter() doesn't use __getattr__ to find the __iter__ method
501 def __iter__(self):
Serhiy Storchakad83b7c22015-03-20 16:11:20 +0200502 # Don't return iter(self.file), but yield from it to avoid closing
R David Murray75ed90a2015-03-22 12:33:46 -0400503 # file as long as it's being used as iterator (see issue #23700). We
504 # can't use 'yield from' here because iter(file) returns the file
505 # object itself, which has a close method, and thus the file would get
506 # closed when the generator is finalized, due to PEP380 semantics.
Serhiy Storchakad83b7c22015-03-20 16:11:20 +0200507 for line in self.file:
508 yield line
Christian Heimes3ecfea712008-02-09 20:51:34 +0000509
510
Guido van Rossumf0c74162007-08-28 03:29:45 +0000511def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
Gregory P. Smithad577b92015-05-22 16:18:14 -0700512 newline=None, suffix=None, prefix=None,
sth825aab92018-05-23 07:07:01 +0200513 dir=None, delete=True, *, errors=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000514 """Create and return a temporary file.
515 Arguments:
516 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000517 'mode' -- the mode argument to io.open (default "w+b").
518 'buffering' -- the buffer size argument to io.open (default -1).
519 'encoding' -- the encoding argument to io.open (default None)
520 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000521 'delete' -- whether the file is deleted on close (default True).
sth825aab92018-05-23 07:07:01 +0200522 'errors' -- the errors argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000523 The file is created as mkstemp() would do it.
Tim Peters1baa22af2001-01-12 10:02:46 +0000524
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000525 Returns an object with a file-like interface; the name of the file
Martin Panter1f0e1f32016-02-22 10:10:00 +0000526 is accessible as its 'name' attribute. The file will be automatically
527 deleted when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000528 """
Tim Peters1baa22af2001-01-12 10:02:46 +0000529
Gregory P. Smithad577b92015-05-22 16:18:14 -0700530 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000531
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000532 flags = _bin_openflags
Tim Peters1baa22af2001-01-12 10:02:46 +0000533
Guido van Rossum0e548712002-08-09 16:14:33 +0000534 # Setting O_TEMPORARY in the flags causes the OS to delete
535 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000536 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000537 flags |= _os.O_TEMPORARY
Tim Peters1baa22af2001-01-12 10:02:46 +0000538
Gregory P. Smithad577b92015-05-22 16:18:14 -0700539 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100540 try:
541 file = _io.open(fd, mode, buffering=buffering,
sth825aab92018-05-23 07:07:01 +0200542 newline=newline, encoding=encoding, errors=errors)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000543
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100544 return _TemporaryFileWrapper(file, name, delete)
Martin Panter7869a222016-02-28 05:22:20 +0000545 except BaseException:
546 _os.unlink(name)
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100547 _os.close(fd)
548 raise
Guido van Rossum0e548712002-08-09 16:14:33 +0000549
Steve Dower60419a72019-06-24 08:42:54 -0700550if _os.name != 'posix' or _sys.platform == 'cygwin':
Jason Tishler80c02af2002-08-14 15:10:09 +0000551 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
552 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000553 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22af2001-01-12 10:02:46 +0000554
555else:
Victor Stinnerd967fc92014-06-05 14:27:45 +0200556 # Is the O_TMPFILE flag available and does it work?
557 # The flag is set to False if os.open(dir, os.O_TMPFILE) raises an
558 # IsADirectoryError exception
559 _O_TMPFILE_WORKS = hasattr(_os, 'O_TMPFILE')
560
Guido van Rossumf0c74162007-08-28 03:29:45 +0000561 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
Gregory P. Smithad577b92015-05-22 16:18:14 -0700562 newline=None, suffix=None, prefix=None,
sth825aab92018-05-23 07:07:01 +0200563 dir=None, *, errors=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000564 """Create and return a temporary file.
565 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000566 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000567 'mode' -- the mode argument to io.open (default "w+b").
568 'buffering' -- the buffer size argument to io.open (default -1).
569 'encoding' -- the encoding argument to io.open (default None)
570 'newline' -- the newline argument to io.open (default None)
sth825aab92018-05-23 07:07:01 +0200571 'errors' -- the errors argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000572 The file is created as mkstemp() would do it.
Tim Peters1baa22af2001-01-12 10:02:46 +0000573
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000574 Returns an object with a file-like interface. The file has no
575 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000576 """
Victor Stinnerd967fc92014-06-05 14:27:45 +0200577 global _O_TMPFILE_WORKS
Guido van Rossum0e548712002-08-09 16:14:33 +0000578
Gregory P. Smithad577b92015-05-22 16:18:14 -0700579 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000580
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000581 flags = _bin_openflags
Victor Stinnerd967fc92014-06-05 14:27:45 +0200582 if _O_TMPFILE_WORKS:
583 try:
584 flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT
585 fd = _os.open(dir, flags2, 0o600)
586 except IsADirectoryError:
Victor Stinner9aba8c82015-10-21 00:15:08 +0200587 # Linux kernel older than 3.11 ignores the O_TMPFILE flag:
588 # O_TMPFILE is read as O_DIRECTORY. Trying to open a directory
589 # with O_RDWR|O_DIRECTORY fails with IsADirectoryError, a
590 # directory cannot be open to write. Set flag to False to not
591 # try again.
Victor Stinnerd967fc92014-06-05 14:27:45 +0200592 _O_TMPFILE_WORKS = False
593 except OSError:
594 # The filesystem of the directory does not support O_TMPFILE.
595 # For example, OSError(95, 'Operation not supported').
Victor Stinner9aba8c82015-10-21 00:15:08 +0200596 #
597 # On Linux kernel older than 3.11, trying to open a regular
598 # file (or a symbolic link to a regular file) with O_TMPFILE
599 # fails with NotADirectoryError, because O_TMPFILE is read as
600 # O_DIRECTORY.
Victor Stinnerd967fc92014-06-05 14:27:45 +0200601 pass
602 else:
603 try:
604 return _io.open(fd, mode, buffering=buffering,
sth825aab92018-05-23 07:07:01 +0200605 newline=newline, encoding=encoding,
606 errors=errors)
Victor Stinnerd967fc92014-06-05 14:27:45 +0200607 except:
608 _os.close(fd)
609 raise
610 # Fallback to _mkstemp_inner().
Guido van Rossum0e548712002-08-09 16:14:33 +0000611
Gregory P. Smithad577b92015-05-22 16:18:14 -0700612 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Guido van Rossum0e548712002-08-09 16:14:33 +0000613 try:
614 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000615 return _io.open(fd, mode, buffering=buffering,
sth825aab92018-05-23 07:07:01 +0200616 newline=newline, encoding=encoding, errors=errors)
Guido van Rossum0e548712002-08-09 16:14:33 +0000617 except:
618 _os.close(fd)
619 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000620
621class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200622 """Temporary file wrapper, specialized to switch from BytesIO
623 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000624 when a fileno is needed.
625 """
626 _rolled = False
627
Guido van Rossumf0c74162007-08-28 03:29:45 +0000628 def __init__(self, max_size=0, mode='w+b', buffering=-1,
629 encoding=None, newline=None,
sth825aab92018-05-23 07:07:01 +0200630 suffix=None, prefix=None, dir=None, *, errors=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000631 if 'b' in mode:
632 self._file = _io.BytesIO()
633 else:
Inada Naokiea9835c2019-11-27 22:22:06 +0900634 self._file = _io.TextIOWrapper(_io.BytesIO(),
635 encoding=encoding, errors=errors,
636 newline=newline)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000637 self._max_size = max_size
638 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000639 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
640 'suffix': suffix, 'prefix': prefix,
641 'encoding': encoding, 'newline': newline,
sth825aab92018-05-23 07:07:01 +0200642 'dir': dir, 'errors': errors}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000643
Guido van Rossum48b069a2020-04-07 09:50:06 -0700644 __class_getitem__ = classmethod(_types.GenericAlias)
Batuhan Taşkaya09c482f2019-12-30 19:08:08 +0300645
Guido van Rossumd8faa362007-04-27 19:54:29 +0000646 def _check(self, file):
647 if self._rolled: return
648 max_size = self._max_size
649 if max_size and file.tell() > max_size:
650 self.rollover()
651
652 def rollover(self):
653 if self._rolled: return
654 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000655 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000656 del self._TemporaryFileArgs
657
Inada Naokiea9835c2019-11-27 22:22:06 +0900658 pos = file.tell()
659 if hasattr(newfile, 'buffer'):
660 newfile.buffer.write(file.detach().getvalue())
661 else:
662 newfile.write(file.getvalue())
663 newfile.seek(pos, 0)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000664
665 self._rolled = True
666
Christian Heimes3ecfea712008-02-09 20:51:34 +0000667 # The method caching trick from NamedTemporaryFile
668 # won't work here, because _file may change from a
Serhiy Storchaka50254c52013-08-29 11:35:43 +0300669 # BytesIO/StringIO instance to a real file. So we list
Christian Heimes3ecfea712008-02-09 20:51:34 +0000670 # all the methods directly.
671
672 # Context management protocol
673 def __enter__(self):
674 if self._file.closed:
675 raise ValueError("Cannot enter context with closed file")
676 return self
677
678 def __exit__(self, exc, value, tb):
679 self._file.close()
680
Guido van Rossumd8faa362007-04-27 19:54:29 +0000681 # file protocol
682 def __iter__(self):
683 return self._file.__iter__()
684
685 def close(self):
686 self._file.close()
687
688 @property
689 def closed(self):
690 return self._file.closed
691
692 @property
693 def encoding(self):
sth825aab92018-05-23 07:07:01 +0200694 return self._file.encoding
695
696 @property
697 def errors(self):
698 return self._file.errors
Guido van Rossumd8faa362007-04-27 19:54:29 +0000699
700 def fileno(self):
701 self.rollover()
702 return self._file.fileno()
703
704 def flush(self):
705 self._file.flush()
706
707 def isatty(self):
708 return self._file.isatty()
709
710 @property
711 def mode(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200712 try:
713 return self._file.mode
714 except AttributeError:
715 return self._TemporaryFileArgs['mode']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000716
717 @property
718 def name(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200719 try:
720 return self._file.name
721 except AttributeError:
722 return None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000723
724 @property
725 def newlines(self):
sth825aab92018-05-23 07:07:01 +0200726 return self._file.newlines
Guido van Rossumd8faa362007-04-27 19:54:29 +0000727
728 def read(self, *args):
729 return self._file.read(*args)
730
731 def readline(self, *args):
732 return self._file.readline(*args)
733
734 def readlines(self, *args):
735 return self._file.readlines(*args)
736
737 def seek(self, *args):
Inada Naoki485e7152020-04-17 15:56:35 +0900738 return self._file.seek(*args)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000739
Guido van Rossumd8faa362007-04-27 19:54:29 +0000740 def tell(self):
741 return self._file.tell()
742
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100743 def truncate(self, size=None):
744 if size is None:
745 self._file.truncate()
746 else:
747 if size > self._max_size:
748 self.rollover()
749 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000750
751 def write(self, s):
752 file = self._file
753 rv = file.write(s)
754 self._check(file)
755 return rv
756
757 def writelines(self, iterable):
758 file = self._file
759 rv = file.writelines(iterable)
760 self._check(file)
761 return rv
762
Nick Coghlan543af752010-10-24 11:23:25 +0000763
764class TemporaryDirectory(object):
765 """Create and return a temporary directory. This has the same
766 behavior as mkdtemp but can be used as a context manager. For
767 example:
768
769 with TemporaryDirectory() as tmpdir:
770 ...
771
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300772 Upon exiting the context, the directory and everything contained
Nick Coghlan543af752010-10-24 11:23:25 +0000773 in it are removed.
774 """
775
Gregory P. Smithad577b92015-05-22 16:18:14 -0700776 def __init__(self, suffix=None, prefix=None, dir=None):
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000777 self.name = mkdtemp(suffix, prefix, dir)
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200778 self._finalizer = _weakref.finalize(
779 self, self._cleanup, self.name,
780 warn_message="Implicitly cleaning up {!r}".format(self))
781
782 @classmethod
Serhiy Storchakae9b51c02019-05-31 11:30:37 +0300783 def _rmtree(cls, name):
784 def onerror(func, path, exc_info):
785 if issubclass(exc_info[0], PermissionError):
786 def resetperms(path):
787 try:
788 _os.chflags(path, 0)
789 except AttributeError:
790 pass
791 _os.chmod(path, 0o700)
792
793 try:
794 if path != name:
795 resetperms(_os.path.dirname(path))
796 resetperms(path)
797
798 try:
799 _os.unlink(path)
800 # PermissionError is raised on FreeBSD for directories
801 except (IsADirectoryError, PermissionError):
802 cls._rmtree(path)
803 except FileNotFoundError:
804 pass
805 elif issubclass(exc_info[0], FileNotFoundError):
806 pass
807 else:
808 raise
809
810 _shutil.rmtree(name, onerror=onerror)
811
812 @classmethod
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300813 def _cleanup(cls, name, warn_message):
Serhiy Storchakae9b51c02019-05-31 11:30:37 +0300814 cls._rmtree(name)
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300815 _warnings.warn(warn_message, ResourceWarning)
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200816
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000817 def __repr__(self):
818 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000819
820 def __enter__(self):
821 return self.name
822
Nick Coghlan543af752010-10-24 11:23:25 +0000823 def __exit__(self, exc, value, tb):
824 self.cleanup()
825
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200826 def cleanup(self):
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300827 if self._finalizer.detach():
Serhiy Storchakae9b51c02019-05-31 11:30:37 +0300828 self._rmtree(self.name)
Batuhan Taşkaya03615562020-04-10 17:46:36 +0300829
830 __class_getitem__ = classmethod(_types.GenericAlias)