blob: c3fe61aa0af4f7696bfdaef7f4cde0173cdf78c1 [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
Inada Naoki43ca0842020-10-31 11:15:38 +0900132 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
133
134 @property
135 def rng(self):
136 cur_pid = _os.getpid()
137 if cur_pid != getattr(self, '_rng_pid', None):
138 self._rng = _Random()
139 self._rng_pid = cur_pid
140 return self._rng
Victor Stinner1e62bf12017-04-19 22:59:51 +0200141
142 def __iter__(self):
143 return self
144
145 def __next__(self):
Inada Naokid2810052020-11-01 20:02:03 +0900146 return ''.join(self.rng.choices(self.characters, k=8))
Guido van Rossum0e548712002-08-09 16:14:33 +0000147
148def _candidate_tempdir_list():
149 """Generate a list of candidate temporary directories which
150 _get_default_tempdir will try."""
151
152 dirlist = []
153
154 # First, try the environment.
155 for envname in 'TMPDIR', 'TEMP', 'TMP':
156 dirname = _os.getenv(envname)
157 if dirname: dirlist.append(dirname)
158
159 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000160 if _os.name == 'nt':
Steve Dowere5f41d22018-05-16 17:50:29 -0400161 dirlist.extend([ _os.path.expanduser(r'~\AppData\Local\Temp'),
162 _os.path.expandvars(r'%SYSTEMROOT%\Temp'),
163 r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
Guido van Rossum0e548712002-08-09 16:14:33 +0000164 else:
165 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
166
167 # As a last resort, the current directory.
168 try:
169 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200170 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000171 dirlist.append(_os.curdir)
172
173 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000174
Guido van Rossum0e548712002-08-09 16:14:33 +0000175def _get_default_tempdir():
176 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000177 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000178
179 We determine whether or not a candidate temp dir is usable by
180 trying to create and write to a file in that directory. If this
181 is successful, the test file is deleted. To prevent denial of
182 service, the name of the test file must be randomized."""
183
184 namer = _RandomNameSequence()
185 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000186
187 for dir in dirlist:
188 if dir != _os.curdir:
Tim Golden6d09f092013-10-25 18:38:16 +0100189 dir = _os.path.abspath(dir)
Guido van Rossum0e548712002-08-09 16:14:33 +0000190 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000191 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000192 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000193 filename = _os.path.join(dir, name)
194 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000195 fd = _os.open(filename, _bin_openflags, 0o600)
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200196 try:
197 try:
Serhiy Storchaka76a2ed12013-02-13 00:59:26 +0200198 with _io.open(fd, 'wb', closefd=False) as fp:
199 fp.write(b'blat')
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200200 finally:
201 _os.close(fd)
202 finally:
203 _os.unlink(filename)
Guido van Rossum0e548712002-08-09 16:14:33 +0000204 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200205 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000206 pass
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300207 except PermissionError:
208 # This exception is thrown when a directory with the chosen name
209 # already exists on windows.
210 if (_os.name == 'nt' and _os.path.isdir(dir) and
211 _os.access(dir, _os.W_OK)):
212 continue
213 break # no point trying more names in this directory
Florent Xicluna68f71a32011-10-28 16:06:23 +0200214 except OSError:
215 break # no point trying more names in this directory
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200216 raise FileNotFoundError(_errno.ENOENT,
217 "No usable temporary directory found in %s" %
218 dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000219
Guido van Rossume888cdc2002-08-17 14:50:24 +0000220_name_sequence = None
221
Guido van Rossum0e548712002-08-09 16:14:33 +0000222def _get_candidate_names():
223 """Common setup sequence for all user-callable interfaces."""
224
Guido van Rossume888cdc2002-08-17 14:50:24 +0000225 global _name_sequence
226 if _name_sequence is None:
227 _once_lock.acquire()
228 try:
229 if _name_sequence is None:
230 _name_sequence = _RandomNameSequence()
231 finally:
232 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000233 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000234
235
Gregory P. Smithad577b92015-05-22 16:18:14 -0700236def _mkstemp_inner(dir, pre, suf, flags, output_type):
Guido van Rossum0e548712002-08-09 16:14:33 +0000237 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000238
Guido van Rossum0e548712002-08-09 16:14:33 +0000239 names = _get_candidate_names()
Gregory P. Smithad577b92015-05-22 16:18:14 -0700240 if output_type is bytes:
241 names = map(_os.fsencode, names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000242
Guido van Rossum805365e2007-05-07 22:24:25 +0000243 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000244 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000245 file = _os.path.join(dir, pre + name + suf)
Steve Dower60419a72019-06-24 08:42:54 -0700246 _sys.audit("tempfile.mkstemp", file)
Guido van Rossum0e548712002-08-09 16:14:33 +0000247 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000248 fd = _os.open(file, flags, 0o600)
Florent Xicluna68f71a32011-10-28 16:06:23 +0200249 except FileExistsError:
250 continue # try again
Eli Benderskyf315df32013-09-06 06:11:19 -0700251 except PermissionError:
252 # This exception is thrown when a directory with the chosen name
253 # already exists on windows.
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300254 if (_os.name == 'nt' and _os.path.isdir(dir) and
255 _os.access(dir, _os.W_OK)):
Eli Benderskyf315df32013-09-06 06:11:19 -0700256 continue
257 else:
258 raise
Gregory P. Smithad577b92015-05-22 16:18:14 -0700259 return (fd, _os.path.abspath(file))
Guido van Rossum0e548712002-08-09 16:14:33 +0000260
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200261 raise FileExistsError(_errno.EEXIST,
262 "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000263
Guido van Rossum0e548712002-08-09 16:14:33 +0000264
265# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000266
Guido van Rossum41f95031992-03-31 19:02:01 +0000267def gettempprefix():
Gregory P. Smithad577b92015-05-22 16:18:14 -0700268 """The default prefix for temporary directories."""
Guido van Rossum0e548712002-08-09 16:14:33 +0000269 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000270
Gregory P. Smithad577b92015-05-22 16:18:14 -0700271def gettempprefixb():
272 """The default prefix for temporary directories as bytes."""
273 return _os.fsencode(gettempprefix())
274
Guido van Rossume888cdc2002-08-17 14:50:24 +0000275tempdir = None
276
Guido van Rossum0e548712002-08-09 16:14:33 +0000277def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000278 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000279 global tempdir
280 if tempdir is None:
281 _once_lock.acquire()
282 try:
283 if tempdir is None:
284 tempdir = _get_default_tempdir()
285 finally:
286 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000287 return tempdir
288
Gregory P. Smithad577b92015-05-22 16:18:14 -0700289def gettempdirb():
290 """A bytes version of tempfile.gettempdir()."""
291 return _os.fsencode(gettempdir())
292
293def mkstemp(suffix=None, prefix=None, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000294 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000295 file. The return value is a pair (fd, name) where fd is the
296 file descriptor returned by os.open, and name is the filename.
297
Martin Panter9b566c32015-11-07 00:32:50 +0000298 If 'suffix' is not None, the file name will end with that suffix,
Guido van Rossum0e548712002-08-09 16:14:33 +0000299 otherwise there will be no suffix.
300
Martin Panter9b566c32015-11-07 00:32:50 +0000301 If 'prefix' is not None, the file name will begin with that prefix,
Guido van Rossum0e548712002-08-09 16:14:33 +0000302 otherwise a default prefix is used.
303
Martin Panter9b566c32015-11-07 00:32:50 +0000304 If 'dir' is not None, the file will be created in that directory,
Guido van Rossum0e548712002-08-09 16:14:33 +0000305 otherwise a default directory is used.
306
Tim Peters04490bf2002-08-14 15:41:26 +0000307 If 'text' is specified and true, the file is opened in text
Rishav Kundue55de682020-08-14 07:03:14 +0530308 mode. Else (the default) the file is opened in binary mode.
Guido van Rossum0e548712002-08-09 16:14:33 +0000309
Martin Panter9b566c32015-11-07 00:32:50 +0000310 If any of 'suffix', 'prefix' and 'dir' are not None, they must be the
311 same type. If they are bytes, the returned name will be bytes; str
312 otherwise.
Gregory P. Smithad577b92015-05-22 16:18:14 -0700313
Guido van Rossum0e548712002-08-09 16:14:33 +0000314 The file is readable and writable only by the creating user ID.
315 If the operating system uses permission bits to indicate whether a
316 file is executable, the file is executable by no one. The file
317 descriptor is not inherited by children of this process.
318
319 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000320 """
321
Gregory P. Smithad577b92015-05-22 16:18:14 -0700322 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000323
Tim Peters04490bf2002-08-14 15:41:26 +0000324 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000325 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000326 else:
327 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000328
Gregory P. Smithad577b92015-05-22 16:18:14 -0700329 return _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Guido van Rossumcff34541992-01-14 18:31:56 +0000330
Guido van Rossumeee94981991-11-12 15:38:08 +0000331
Gregory P. Smithad577b92015-05-22 16:18:14 -0700332def mkdtemp(suffix=None, prefix=None, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000333 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000334 directory. The return value is the pathname of the directory.
335
Tim Peters04490bf2002-08-14 15:41:26 +0000336 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000337 not accepted.
338
339 The directory is readable, writable, and searchable only by the
340 creating user.
341
342 Caller is responsible for deleting the directory when done with it.
343 """
344
Gregory P. Smithad577b92015-05-22 16:18:14 -0700345 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000346
Guido van Rossum0e548712002-08-09 16:14:33 +0000347 names = _get_candidate_names()
Gregory P. Smithad577b92015-05-22 16:18:14 -0700348 if output_type is bytes:
349 names = map(_os.fsencode, names)
Tim Petersa0d55de2002-08-09 18:01:01 +0000350
Guido van Rossum805365e2007-05-07 22:24:25 +0000351 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000352 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000353 file = _os.path.join(dir, prefix + name + suffix)
Steve Dower60419a72019-06-24 08:42:54 -0700354 _sys.audit("tempfile.mkdtemp", file)
Guido van Rossum0e548712002-08-09 16:14:33 +0000355 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000356 _os.mkdir(file, 0o700)
Florent Xicluna68f71a32011-10-28 16:06:23 +0200357 except FileExistsError:
358 continue # try again
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300359 except PermissionError:
360 # This exception is thrown when a directory with the chosen name
361 # already exists on windows.
362 if (_os.name == 'nt' and _os.path.isdir(dir) and
363 _os.access(dir, _os.W_OK)):
364 continue
365 else:
366 raise
Gregory P. Smithad577b92015-05-22 16:18:14 -0700367 return file
Guido van Rossum0e548712002-08-09 16:14:33 +0000368
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200369 raise FileExistsError(_errno.EEXIST,
370 "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000371
Guido van Rossume888cdc2002-08-17 14:50:24 +0000372def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000373 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000374 file is not created.
375
Martin Panter9b566c32015-11-07 00:32:50 +0000376 Arguments are similar to mkstemp, except that the 'text' argument is
377 not accepted, and suffix=None, prefix=None and bytes file names are not
378 supported.
Guido van Rossum0e548712002-08-09 16:14:33 +0000379
Gregory P. Smithad577b92015-05-22 16:18:14 -0700380 THIS FUNCTION IS UNSAFE AND SHOULD NOT BE USED. The file name may
381 refer to a file that did not exist at some point, but by the time
Guido van Rossum0e548712002-08-09 16:14:33 +0000382 you get around to creating it, someone else may have beaten you to
383 the punch.
384 """
385
Guido van Rossum44f602d2002-11-22 15:56:29 +0000386## from warnings import warn as _warn
387## _warn("mktemp is a potential security risk to your program",
388## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000389
Guido van Rossume888cdc2002-08-17 14:50:24 +0000390 if dir is None:
391 dir = gettempdir()
392
Guido van Rossum0e548712002-08-09 16:14:33 +0000393 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000394 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000395 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000396 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000397 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000398 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000399
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200400 raise FileExistsError(_errno.EEXIST,
401 "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000402
Christian Heimes3ecfea712008-02-09 20:51:34 +0000403
Antoine Pitrou17c93262013-12-21 22:14:56 +0100404class _TemporaryFileCloser:
405 """A separate object allowing proper closing of a temporary file's
406 underlying file object, without adding a __del__ method to the
407 temporary file."""
Tim Petersa255a722001-12-18 22:32:40 +0000408
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200409 file = None # Set here since __del__ checks it
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200410 close_called = False
411
Guido van Rossumd8faa362007-04-27 19:54:29 +0000412 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000413 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000414 self.name = name
Guido van Rossumd8faa362007-04-27 19:54:29 +0000415 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000416
Guido van Rossum0e548712002-08-09 16:14:33 +0000417 # NT provides delete-on-close as a primitive, so we don't need
418 # the wrapper to do anything special. We still use it so that
419 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
420 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000421 # Cache the unlinker so we don't get spurious errors at
422 # shutdown when the module-level "os" is None'd out. Note
423 # that this must be referenced as self.unlink, because the
424 # name TemporaryFileWrapper may also get None'd out before
425 # __del__ is called.
Tim Peters1baa22a2001-01-12 10:02:46 +0000426
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200427 def close(self, unlink=_os.unlink):
428 if not self.close_called and self.file is not None:
Tim Peters6ef966e2002-11-21 15:48:33 +0000429 self.close_called = True
Serhiy Storchaka7e7a3db2015-04-10 13:24:41 +0300430 try:
431 self.file.close()
432 finally:
433 if self.delete:
434 unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000435
Antoine Pitrou17c93262013-12-21 22:14:56 +0100436 # Need to ensure the file is deleted on __del__
Guido van Rossum0e548712002-08-09 16:14:33 +0000437 def __del__(self):
438 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000439
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000440 else:
Antoine Pitrou17c93262013-12-21 22:14:56 +0100441 def close(self):
442 if not self.close_called:
443 self.close_called = True
444 self.file.close()
445
446
447class _TemporaryFileWrapper:
448 """Temporary file wrapper
449
450 This class provides a wrapper around files opened for
451 temporary use. In particular, it seeks to automatically
452 remove the file when it is no longer needed.
453 """
454
455 def __init__(self, file, name, delete=True):
456 self.file = file
457 self.name = name
458 self.delete = delete
459 self._closer = _TemporaryFileCloser(file, name, delete)
460
461 def __getattr__(self, name):
462 # Attribute lookups are delegated to the underlying file
463 # and cached for non-numeric results
464 # (i.e. methods are cached, closed and friends are not)
465 file = self.__dict__['file']
466 a = getattr(file, name)
467 if hasattr(a, '__call__'):
468 func = a
469 @_functools.wraps(func)
470 def func_wrapper(*args, **kwargs):
471 return func(*args, **kwargs)
472 # Avoid closing the file as long as the wrapper is alive,
473 # see issue #18879.
474 func_wrapper._closer = self._closer
475 a = func_wrapper
476 if not isinstance(a, int):
477 setattr(self, name, a)
478 return a
479
480 # The underlying __enter__ method returns the wrong object
481 # (self.file) so override it to return the wrapper
482 def __enter__(self):
483 self.file.__enter__()
484 return self
485
486 # Need to trap __exit__ as well to ensure the file gets
487 # deleted when used in a with statement
488 def __exit__(self, exc, value, tb):
489 result = self.file.__exit__(exc, value, tb)
490 self.close()
491 return result
492
493 def close(self):
494 """
495 Close the temporary file, possibly deleting it.
496 """
497 self._closer.close()
498
499 # iter() doesn't use __getattr__ to find the __iter__ method
500 def __iter__(self):
Serhiy Storchakad83b7c22015-03-20 16:11:20 +0200501 # Don't return iter(self.file), but yield from it to avoid closing
R David Murray75ed90a2015-03-22 12:33:46 -0400502 # file as long as it's being used as iterator (see issue #23700). We
503 # can't use 'yield from' here because iter(file) returns the file
504 # object itself, which has a close method, and thus the file would get
505 # closed when the generator is finalized, due to PEP380 semantics.
Serhiy Storchakad83b7c22015-03-20 16:11:20 +0200506 for line in self.file:
507 yield line
Christian Heimes3ecfea712008-02-09 20:51:34 +0000508
509
Guido van Rossumf0c74162007-08-28 03:29:45 +0000510def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
Gregory P. Smithad577b92015-05-22 16:18:14 -0700511 newline=None, suffix=None, prefix=None,
sth825aab92018-05-23 07:07:01 +0200512 dir=None, delete=True, *, errors=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000513 """Create and return a temporary file.
514 Arguments:
515 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000516 'mode' -- the mode argument to io.open (default "w+b").
517 'buffering' -- the buffer size argument to io.open (default -1).
518 'encoding' -- the encoding argument to io.open (default None)
519 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000520 'delete' -- whether the file is deleted on close (default True).
sth825aab92018-05-23 07:07:01 +0200521 'errors' -- the errors argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000522 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000523
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000524 Returns an object with a file-like interface; the name of the file
Martin Panter1f0e1f32016-02-22 10:10:00 +0000525 is accessible as its 'name' attribute. The file will be automatically
526 deleted when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000527 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000528
Gregory P. Smithad577b92015-05-22 16:18:14 -0700529 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000530
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000531 flags = _bin_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000532
Guido van Rossum0e548712002-08-09 16:14:33 +0000533 # Setting O_TEMPORARY in the flags causes the OS to delete
534 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000535 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000536 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000537
Gregory P. Smithad577b92015-05-22 16:18:14 -0700538 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100539 try:
540 file = _io.open(fd, mode, buffering=buffering,
sth825aab92018-05-23 07:07:01 +0200541 newline=newline, encoding=encoding, errors=errors)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000542
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100543 return _TemporaryFileWrapper(file, name, delete)
Martin Panter7869a222016-02-28 05:22:20 +0000544 except BaseException:
545 _os.unlink(name)
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100546 _os.close(fd)
547 raise
Guido van Rossum0e548712002-08-09 16:14:33 +0000548
Steve Dower60419a72019-06-24 08:42:54 -0700549if _os.name != 'posix' or _sys.platform == 'cygwin':
Jason Tishler80c02af2002-08-14 15:10:09 +0000550 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
551 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000552 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000553
554else:
Victor Stinnerd967fc92014-06-05 14:27:45 +0200555 # Is the O_TMPFILE flag available and does it work?
556 # The flag is set to False if os.open(dir, os.O_TMPFILE) raises an
557 # IsADirectoryError exception
558 _O_TMPFILE_WORKS = hasattr(_os, 'O_TMPFILE')
559
Guido van Rossumf0c74162007-08-28 03:29:45 +0000560 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
Gregory P. Smithad577b92015-05-22 16:18:14 -0700561 newline=None, suffix=None, prefix=None,
sth825aab92018-05-23 07:07:01 +0200562 dir=None, *, errors=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000563 """Create and return a temporary file.
564 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000565 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000566 'mode' -- the mode argument to io.open (default "w+b").
567 'buffering' -- the buffer size argument to io.open (default -1).
568 'encoding' -- the encoding argument to io.open (default None)
569 'newline' -- the newline argument to io.open (default None)
sth825aab92018-05-23 07:07:01 +0200570 'errors' -- the errors argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000571 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000572
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000573 Returns an object with a file-like interface. The file has no
574 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000575 """
Victor Stinnerd967fc92014-06-05 14:27:45 +0200576 global _O_TMPFILE_WORKS
Guido van Rossum0e548712002-08-09 16:14:33 +0000577
Gregory P. Smithad577b92015-05-22 16:18:14 -0700578 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000579
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000580 flags = _bin_openflags
Victor Stinnerd967fc92014-06-05 14:27:45 +0200581 if _O_TMPFILE_WORKS:
582 try:
583 flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT
584 fd = _os.open(dir, flags2, 0o600)
585 except IsADirectoryError:
Victor Stinner9aba8c82015-10-21 00:15:08 +0200586 # Linux kernel older than 3.11 ignores the O_TMPFILE flag:
587 # O_TMPFILE is read as O_DIRECTORY. Trying to open a directory
588 # with O_RDWR|O_DIRECTORY fails with IsADirectoryError, a
589 # directory cannot be open to write. Set flag to False to not
590 # try again.
Victor Stinnerd967fc92014-06-05 14:27:45 +0200591 _O_TMPFILE_WORKS = False
592 except OSError:
593 # The filesystem of the directory does not support O_TMPFILE.
594 # For example, OSError(95, 'Operation not supported').
Victor Stinner9aba8c82015-10-21 00:15:08 +0200595 #
596 # On Linux kernel older than 3.11, trying to open a regular
597 # file (or a symbolic link to a regular file) with O_TMPFILE
598 # fails with NotADirectoryError, because O_TMPFILE is read as
599 # O_DIRECTORY.
Victor Stinnerd967fc92014-06-05 14:27:45 +0200600 pass
601 else:
602 try:
603 return _io.open(fd, mode, buffering=buffering,
sth825aab92018-05-23 07:07:01 +0200604 newline=newline, encoding=encoding,
605 errors=errors)
Victor Stinnerd967fc92014-06-05 14:27:45 +0200606 except:
607 _os.close(fd)
608 raise
609 # Fallback to _mkstemp_inner().
Guido van Rossum0e548712002-08-09 16:14:33 +0000610
Gregory P. Smithad577b92015-05-22 16:18:14 -0700611 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Guido van Rossum0e548712002-08-09 16:14:33 +0000612 try:
613 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000614 return _io.open(fd, mode, buffering=buffering,
sth825aab92018-05-23 07:07:01 +0200615 newline=newline, encoding=encoding, errors=errors)
Guido van Rossum0e548712002-08-09 16:14:33 +0000616 except:
617 _os.close(fd)
618 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000619
620class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200621 """Temporary file wrapper, specialized to switch from BytesIO
622 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000623 when a fileno is needed.
624 """
625 _rolled = False
626
Guido van Rossumf0c74162007-08-28 03:29:45 +0000627 def __init__(self, max_size=0, mode='w+b', buffering=-1,
628 encoding=None, newline=None,
sth825aab92018-05-23 07:07:01 +0200629 suffix=None, prefix=None, dir=None, *, errors=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000630 if 'b' in mode:
631 self._file = _io.BytesIO()
632 else:
Inada Naokiea9835c2019-11-27 22:22:06 +0900633 self._file = _io.TextIOWrapper(_io.BytesIO(),
634 encoding=encoding, errors=errors,
635 newline=newline)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000636 self._max_size = max_size
637 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000638 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
639 'suffix': suffix, 'prefix': prefix,
640 'encoding': encoding, 'newline': newline,
sth825aab92018-05-23 07:07:01 +0200641 'dir': dir, 'errors': errors}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000642
Guido van Rossum48b069a2020-04-07 09:50:06 -0700643 __class_getitem__ = classmethod(_types.GenericAlias)
Batuhan Taşkaya09c482f2019-12-30 19:08:08 +0300644
Guido van Rossumd8faa362007-04-27 19:54:29 +0000645 def _check(self, file):
646 if self._rolled: return
647 max_size = self._max_size
648 if max_size and file.tell() > max_size:
649 self.rollover()
650
651 def rollover(self):
652 if self._rolled: return
653 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000654 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000655 del self._TemporaryFileArgs
656
Inada Naokiea9835c2019-11-27 22:22:06 +0900657 pos = file.tell()
658 if hasattr(newfile, 'buffer'):
659 newfile.buffer.write(file.detach().getvalue())
660 else:
661 newfile.write(file.getvalue())
662 newfile.seek(pos, 0)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000663
664 self._rolled = True
665
Christian Heimes3ecfea712008-02-09 20:51:34 +0000666 # The method caching trick from NamedTemporaryFile
667 # won't work here, because _file may change from a
Serhiy Storchaka50254c52013-08-29 11:35:43 +0300668 # BytesIO/StringIO instance to a real file. So we list
Christian Heimes3ecfea712008-02-09 20:51:34 +0000669 # all the methods directly.
670
671 # Context management protocol
672 def __enter__(self):
673 if self._file.closed:
674 raise ValueError("Cannot enter context with closed file")
675 return self
676
677 def __exit__(self, exc, value, tb):
678 self._file.close()
679
Guido van Rossumd8faa362007-04-27 19:54:29 +0000680 # file protocol
681 def __iter__(self):
682 return self._file.__iter__()
683
684 def close(self):
685 self._file.close()
686
687 @property
688 def closed(self):
689 return self._file.closed
690
691 @property
692 def encoding(self):
sth825aab92018-05-23 07:07:01 +0200693 return self._file.encoding
694
695 @property
696 def errors(self):
697 return self._file.errors
Guido van Rossumd8faa362007-04-27 19:54:29 +0000698
699 def fileno(self):
700 self.rollover()
701 return self._file.fileno()
702
703 def flush(self):
704 self._file.flush()
705
706 def isatty(self):
707 return self._file.isatty()
708
709 @property
710 def mode(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200711 try:
712 return self._file.mode
713 except AttributeError:
714 return self._TemporaryFileArgs['mode']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000715
716 @property
717 def name(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200718 try:
719 return self._file.name
720 except AttributeError:
721 return None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000722
723 @property
724 def newlines(self):
sth825aab92018-05-23 07:07:01 +0200725 return self._file.newlines
Guido van Rossumd8faa362007-04-27 19:54:29 +0000726
727 def read(self, *args):
728 return self._file.read(*args)
729
730 def readline(self, *args):
731 return self._file.readline(*args)
732
733 def readlines(self, *args):
734 return self._file.readlines(*args)
735
736 def seek(self, *args):
Inada Naoki485e7152020-04-17 15:56:35 +0900737 return self._file.seek(*args)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000738
Guido van Rossumd8faa362007-04-27 19:54:29 +0000739 def tell(self):
740 return self._file.tell()
741
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100742 def truncate(self, size=None):
743 if size is None:
744 self._file.truncate()
745 else:
746 if size > self._max_size:
747 self.rollover()
748 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000749
750 def write(self, s):
751 file = self._file
752 rv = file.write(s)
753 self._check(file)
754 return rv
755
756 def writelines(self, iterable):
757 file = self._file
758 rv = file.writelines(iterable)
759 self._check(file)
760 return rv
761
Nick Coghlan543af752010-10-24 11:23:25 +0000762
763class TemporaryDirectory(object):
764 """Create and return a temporary directory. This has the same
765 behavior as mkdtemp but can be used as a context manager. For
766 example:
767
768 with TemporaryDirectory() as tmpdir:
769 ...
770
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300771 Upon exiting the context, the directory and everything contained
Nick Coghlan543af752010-10-24 11:23:25 +0000772 in it are removed.
773 """
774
Gregory P. Smithad577b92015-05-22 16:18:14 -0700775 def __init__(self, suffix=None, prefix=None, dir=None):
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000776 self.name = mkdtemp(suffix, prefix, dir)
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200777 self._finalizer = _weakref.finalize(
778 self, self._cleanup, self.name,
779 warn_message="Implicitly cleaning up {!r}".format(self))
780
781 @classmethod
Serhiy Storchakae9b51c02019-05-31 11:30:37 +0300782 def _rmtree(cls, name):
783 def onerror(func, path, exc_info):
784 if issubclass(exc_info[0], PermissionError):
785 def resetperms(path):
786 try:
787 _os.chflags(path, 0)
788 except AttributeError:
789 pass
790 _os.chmod(path, 0o700)
791
792 try:
793 if path != name:
794 resetperms(_os.path.dirname(path))
795 resetperms(path)
796
797 try:
798 _os.unlink(path)
799 # PermissionError is raised on FreeBSD for directories
800 except (IsADirectoryError, PermissionError):
801 cls._rmtree(path)
802 except FileNotFoundError:
803 pass
804 elif issubclass(exc_info[0], FileNotFoundError):
805 pass
806 else:
807 raise
808
809 _shutil.rmtree(name, onerror=onerror)
810
811 @classmethod
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300812 def _cleanup(cls, name, warn_message):
Serhiy Storchakae9b51c02019-05-31 11:30:37 +0300813 cls._rmtree(name)
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300814 _warnings.warn(warn_message, ResourceWarning)
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200815
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000816 def __repr__(self):
817 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000818
819 def __enter__(self):
820 return self.name
821
Nick Coghlan543af752010-10-24 11:23:25 +0000822 def __exit__(self, exc, value, tb):
823 self.cleanup()
824
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200825 def cleanup(self):
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300826 if self._finalizer.detach():
Serhiy Storchakae9b51c02019-05-31 11:30:37 +0300827 self._rmtree(self.name)
Batuhan Taşkaya03615562020-04-10 17:46:36 +0300828
829 __class_getitem__ = classmethod(_types.GenericAlias)