blob: 71ecafa5305838c3e9f618f2cb0da4d9086f4ee4 [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
Serhiy Storchakaa28632b2014-01-27 11:21:54 +020046import weakref as _weakref
Antoine Pitroua6a4dc82017-09-07 18:56:24 +020047import _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000048_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000049
50_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000051if hasattr(_os, 'O_NOFOLLOW'):
52 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000053
54_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000055if hasattr(_os, 'O_BINARY'):
56 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000057
58if hasattr(_os, 'TMP_MAX'):
59 TMP_MAX = _os.TMP_MAX
60else:
61 TMP_MAX = 10000
62
Gregory P. Smithad577b92015-05-22 16:18:14 -070063# This variable _was_ unused for legacy reasons, see issue 10354.
64# But as of 3.5 we actually use it at runtime so changing it would
65# have a possibly desirable side effect... But we do not want to support
66# that as an API. It is undocumented on purpose. Do not depend on this.
Tim Petersbd7b4c72002-08-13 23:33:56 +000067template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000068
Guido van Rossum0e548712002-08-09 16:14:33 +000069# Internal routines.
70
71_once_lock = _allocate_lock()
72
Guido van Rossumb256159392003-11-10 02:16:36 +000073if hasattr(_os, "lstat"):
74 _stat = _os.lstat
75elif hasattr(_os, "stat"):
76 _stat = _os.stat
77else:
Florent Xicluna68f71a32011-10-28 16:06:23 +020078 # Fallback. All we need is something that raises OSError if the
Guido van Rossumb256159392003-11-10 02:16:36 +000079 # file doesn't exist.
80 def _stat(fn):
Victor Stinnerdaf45552013-08-28 00:53:59 +020081 fd = _os.open(fn, _os.O_RDONLY)
Victor Stinner69b1e262014-03-20 08:50:52 +010082 _os.close(fd)
Guido van Rossumb256159392003-11-10 02:16:36 +000083
84def _exists(fn):
85 try:
86 _stat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020087 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +000088 return False
89 else:
90 return True
91
Gregory P. Smithad577b92015-05-22 16:18:14 -070092
93def _infer_return_type(*args):
94 """Look at the type of all args and divine their implied return type."""
95 return_type = None
96 for arg in args:
97 if arg is None:
98 continue
99 if isinstance(arg, bytes):
100 if return_type is str:
101 raise TypeError("Can't mix bytes and non-bytes in "
102 "path components.")
103 return_type = bytes
104 else:
105 if return_type is bytes:
106 raise TypeError("Can't mix bytes and non-bytes in "
107 "path components.")
108 return_type = str
109 if return_type is None:
110 return str # tempfile APIs return a str by default.
111 return return_type
112
113
114def _sanitize_params(prefix, suffix, dir):
115 """Common parameter processing for most APIs in this module."""
116 output_type = _infer_return_type(prefix, suffix, dir)
117 if suffix is None:
118 suffix = output_type()
119 if prefix is None:
120 if output_type is str:
121 prefix = template
122 else:
123 prefix = _os.fsencode(template)
124 if dir is None:
125 if output_type is str:
126 dir = gettempdir()
127 else:
128 dir = gettempdirb()
129 return prefix, suffix, dir, output_type
130
131
Victor Stinner1e62bf12017-04-19 22:59:51 +0200132class _RandomNameSequence:
133 """An instance of _RandomNameSequence generates an endless
134 sequence of unpredictable strings which can safely be incorporated
135 into file names. Each string is six characters long. Multiple
136 threads can safely use the same instance at the same time.
137
138 _RandomNameSequence is an iterator."""
Guido van Rossum0e548712002-08-09 16:14:33 +0000139
Raymond Hettinger572895b2010-11-09 03:43:58 +0000140 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Victor Stinner1e62bf12017-04-19 22:59:51 +0200141
142 @property
143 def rng(self):
Antoine Pitrou4558bad2011-11-25 21:28:15 +0100144 cur_pid = _os.getpid()
Victor Stinner1e62bf12017-04-19 22:59:51 +0200145 if cur_pid != getattr(self, '_rng_pid', None):
146 self._rng = _Random()
147 self._rng_pid = cur_pid
148 return self._rng
149
150 def __iter__(self):
151 return self
152
153 def __next__(self):
154 c = self.characters
155 choose = self.rng.choice
156 letters = [choose(c) for dummy in range(8)]
157 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000158
159def _candidate_tempdir_list():
160 """Generate a list of candidate temporary directories which
161 _get_default_tempdir will try."""
162
163 dirlist = []
164
165 # First, try the environment.
166 for envname in 'TMPDIR', 'TEMP', 'TMP':
167 dirname = _os.getenv(envname)
168 if dirname: dirlist.append(dirname)
169
170 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000171 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000172 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
173 else:
174 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
175
176 # As a last resort, the current directory.
177 try:
178 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200179 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000180 dirlist.append(_os.curdir)
181
182 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000183
Guido van Rossum0e548712002-08-09 16:14:33 +0000184def _get_default_tempdir():
185 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000186 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000187
188 We determine whether or not a candidate temp dir is usable by
189 trying to create and write to a file in that directory. If this
190 is successful, the test file is deleted. To prevent denial of
191 service, the name of the test file must be randomized."""
192
193 namer = _RandomNameSequence()
194 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000195
196 for dir in dirlist:
197 if dir != _os.curdir:
Tim Golden6d09f092013-10-25 18:38:16 +0100198 dir = _os.path.abspath(dir)
Guido van Rossum0e548712002-08-09 16:14:33 +0000199 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000200 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000201 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000202 filename = _os.path.join(dir, name)
203 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000204 fd = _os.open(filename, _bin_openflags, 0o600)
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200205 try:
206 try:
Serhiy Storchaka76a2ed12013-02-13 00:59:26 +0200207 with _io.open(fd, 'wb', closefd=False) as fp:
208 fp.write(b'blat')
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200209 finally:
210 _os.close(fd)
211 finally:
212 _os.unlink(filename)
Guido van Rossum0e548712002-08-09 16:14:33 +0000213 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200214 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000215 pass
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300216 except PermissionError:
217 # This exception is thrown when a directory with the chosen name
218 # already exists on windows.
219 if (_os.name == 'nt' and _os.path.isdir(dir) and
220 _os.access(dir, _os.W_OK)):
221 continue
222 break # no point trying more names in this directory
Florent Xicluna68f71a32011-10-28 16:06:23 +0200223 except OSError:
224 break # no point trying more names in this directory
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200225 raise FileNotFoundError(_errno.ENOENT,
226 "No usable temporary directory found in %s" %
227 dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000228
Guido van Rossume888cdc2002-08-17 14:50:24 +0000229_name_sequence = None
230
Guido van Rossum0e548712002-08-09 16:14:33 +0000231def _get_candidate_names():
232 """Common setup sequence for all user-callable interfaces."""
233
Guido van Rossume888cdc2002-08-17 14:50:24 +0000234 global _name_sequence
235 if _name_sequence is None:
236 _once_lock.acquire()
237 try:
238 if _name_sequence is None:
239 _name_sequence = _RandomNameSequence()
240 finally:
241 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000242 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000243
244
Gregory P. Smithad577b92015-05-22 16:18:14 -0700245def _mkstemp_inner(dir, pre, suf, flags, output_type):
Guido van Rossum0e548712002-08-09 16:14:33 +0000246 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000247
Guido van Rossum0e548712002-08-09 16:14:33 +0000248 names = _get_candidate_names()
Gregory P. Smithad577b92015-05-22 16:18:14 -0700249 if output_type is bytes:
250 names = map(_os.fsencode, names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000251
Guido van Rossum805365e2007-05-07 22:24:25 +0000252 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000253 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000254 file = _os.path.join(dir, pre + name + suf)
255 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000256 fd = _os.open(file, flags, 0o600)
Florent Xicluna68f71a32011-10-28 16:06:23 +0200257 except FileExistsError:
258 continue # try again
Eli Benderskyf315df32013-09-06 06:11:19 -0700259 except PermissionError:
260 # This exception is thrown when a directory with the chosen name
261 # already exists on windows.
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300262 if (_os.name == 'nt' and _os.path.isdir(dir) and
263 _os.access(dir, _os.W_OK)):
Eli Benderskyf315df32013-09-06 06:11:19 -0700264 continue
265 else:
266 raise
Gregory P. Smithad577b92015-05-22 16:18:14 -0700267 return (fd, _os.path.abspath(file))
Guido van Rossum0e548712002-08-09 16:14:33 +0000268
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200269 raise FileExistsError(_errno.EEXIST,
270 "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000271
Guido van Rossum0e548712002-08-09 16:14:33 +0000272
273# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000274
Guido van Rossum41f95031992-03-31 19:02:01 +0000275def gettempprefix():
Gregory P. Smithad577b92015-05-22 16:18:14 -0700276 """The default prefix for temporary directories."""
Guido van Rossum0e548712002-08-09 16:14:33 +0000277 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000278
Gregory P. Smithad577b92015-05-22 16:18:14 -0700279def gettempprefixb():
280 """The default prefix for temporary directories as bytes."""
281 return _os.fsencode(gettempprefix())
282
Guido van Rossume888cdc2002-08-17 14:50:24 +0000283tempdir = None
284
Guido van Rossum0e548712002-08-09 16:14:33 +0000285def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000286 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000287 global tempdir
288 if tempdir is None:
289 _once_lock.acquire()
290 try:
291 if tempdir is None:
292 tempdir = _get_default_tempdir()
293 finally:
294 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000295 return tempdir
296
Gregory P. Smithad577b92015-05-22 16:18:14 -0700297def gettempdirb():
298 """A bytes version of tempfile.gettempdir()."""
299 return _os.fsencode(gettempdir())
300
301def mkstemp(suffix=None, prefix=None, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000302 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000303 file. The return value is a pair (fd, name) where fd is the
304 file descriptor returned by os.open, and name is the filename.
305
Martin Panter9b566c32015-11-07 00:32:50 +0000306 If 'suffix' is not None, the file name will end with that suffix,
Guido van Rossum0e548712002-08-09 16:14:33 +0000307 otherwise there will be no suffix.
308
Martin Panter9b566c32015-11-07 00:32:50 +0000309 If 'prefix' is not None, the file name will begin with that prefix,
Guido van Rossum0e548712002-08-09 16:14:33 +0000310 otherwise a default prefix is used.
311
Martin Panter9b566c32015-11-07 00:32:50 +0000312 If 'dir' is not None, the file will be created in that directory,
Guido van Rossum0e548712002-08-09 16:14:33 +0000313 otherwise a default directory is used.
314
Tim Peters04490bf2002-08-14 15:41:26 +0000315 If 'text' is specified and true, the file is opened in text
316 mode. Else (the default) the file is opened in binary mode. On
317 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000318
Martin Panter9b566c32015-11-07 00:32:50 +0000319 If any of 'suffix', 'prefix' and 'dir' are not None, they must be the
320 same type. If they are bytes, the returned name will be bytes; str
321 otherwise.
Gregory P. Smithad577b92015-05-22 16:18:14 -0700322
Guido van Rossum0e548712002-08-09 16:14:33 +0000323 The file is readable and writable only by the creating user ID.
324 If the operating system uses permission bits to indicate whether a
325 file is executable, the file is executable by no one. The file
326 descriptor is not inherited by children of this process.
327
328 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000329 """
330
Gregory P. Smithad577b92015-05-22 16:18:14 -0700331 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000332
Tim Peters04490bf2002-08-14 15:41:26 +0000333 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000334 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000335 else:
336 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000337
Gregory P. Smithad577b92015-05-22 16:18:14 -0700338 return _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Guido van Rossumcff34541992-01-14 18:31:56 +0000339
Guido van Rossumeee94981991-11-12 15:38:08 +0000340
Gregory P. Smithad577b92015-05-22 16:18:14 -0700341def mkdtemp(suffix=None, prefix=None, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000342 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000343 directory. The return value is the pathname of the directory.
344
Tim Peters04490bf2002-08-14 15:41:26 +0000345 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000346 not accepted.
347
348 The directory is readable, writable, and searchable only by the
349 creating user.
350
351 Caller is responsible for deleting the directory when done with it.
352 """
353
Gregory P. Smithad577b92015-05-22 16:18:14 -0700354 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000355
Guido van Rossum0e548712002-08-09 16:14:33 +0000356 names = _get_candidate_names()
Gregory P. Smithad577b92015-05-22 16:18:14 -0700357 if output_type is bytes:
358 names = map(_os.fsencode, names)
Tim Petersa0d55de2002-08-09 18:01:01 +0000359
Guido van Rossum805365e2007-05-07 22:24:25 +0000360 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000361 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000362 file = _os.path.join(dir, prefix + name + suffix)
363 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000364 _os.mkdir(file, 0o700)
Florent Xicluna68f71a32011-10-28 16:06:23 +0200365 except FileExistsError:
366 continue # try again
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300367 except PermissionError:
368 # This exception is thrown when a directory with the chosen name
369 # already exists on windows.
370 if (_os.name == 'nt' and _os.path.isdir(dir) and
371 _os.access(dir, _os.W_OK)):
372 continue
373 else:
374 raise
Gregory P. Smithad577b92015-05-22 16:18:14 -0700375 return file
Guido van Rossum0e548712002-08-09 16:14:33 +0000376
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200377 raise FileExistsError(_errno.EEXIST,
378 "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000379
Guido van Rossume888cdc2002-08-17 14:50:24 +0000380def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000381 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000382 file is not created.
383
Martin Panter9b566c32015-11-07 00:32:50 +0000384 Arguments are similar to mkstemp, except that the 'text' argument is
385 not accepted, and suffix=None, prefix=None and bytes file names are not
386 supported.
Guido van Rossum0e548712002-08-09 16:14:33 +0000387
Gregory P. Smithad577b92015-05-22 16:18:14 -0700388 THIS FUNCTION IS UNSAFE AND SHOULD NOT BE USED. The file name may
389 refer to a file that did not exist at some point, but by the time
Guido van Rossum0e548712002-08-09 16:14:33 +0000390 you get around to creating it, someone else may have beaten you to
391 the punch.
392 """
393
Guido van Rossum44f602d2002-11-22 15:56:29 +0000394## from warnings import warn as _warn
395## _warn("mktemp is a potential security risk to your program",
396## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000397
Guido van Rossume888cdc2002-08-17 14:50:24 +0000398 if dir is None:
399 dir = gettempdir()
400
Guido van Rossum0e548712002-08-09 16:14:33 +0000401 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000402 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000403 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000404 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000405 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000406 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000407
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200408 raise FileExistsError(_errno.EEXIST,
409 "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000410
Christian Heimes3ecfea712008-02-09 20:51:34 +0000411
Antoine Pitrou17c93262013-12-21 22:14:56 +0100412class _TemporaryFileCloser:
413 """A separate object allowing proper closing of a temporary file's
414 underlying file object, without adding a __del__ method to the
415 temporary file."""
Tim Petersa255a722001-12-18 22:32:40 +0000416
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200417 file = None # Set here since __del__ checks it
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200418 close_called = False
419
Guido van Rossumd8faa362007-04-27 19:54:29 +0000420 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000421 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000422 self.name = name
Guido van Rossumd8faa362007-04-27 19:54:29 +0000423 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000424
Guido van Rossum0e548712002-08-09 16:14:33 +0000425 # NT provides delete-on-close as a primitive, so we don't need
426 # the wrapper to do anything special. We still use it so that
427 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
428 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000429 # Cache the unlinker so we don't get spurious errors at
430 # shutdown when the module-level "os" is None'd out. Note
431 # that this must be referenced as self.unlink, because the
432 # name TemporaryFileWrapper may also get None'd out before
433 # __del__ is called.
Tim Peters1baa22a2001-01-12 10:02:46 +0000434
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200435 def close(self, unlink=_os.unlink):
436 if not self.close_called and self.file is not None:
Tim Peters6ef966e2002-11-21 15:48:33 +0000437 self.close_called = True
Serhiy Storchaka7e7a3db2015-04-10 13:24:41 +0300438 try:
439 self.file.close()
440 finally:
441 if self.delete:
442 unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000443
Antoine Pitrou17c93262013-12-21 22:14:56 +0100444 # Need to ensure the file is deleted on __del__
Guido van Rossum0e548712002-08-09 16:14:33 +0000445 def __del__(self):
446 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000447
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000448 else:
Antoine Pitrou17c93262013-12-21 22:14:56 +0100449 def close(self):
450 if not self.close_called:
451 self.close_called = True
452 self.file.close()
453
454
455class _TemporaryFileWrapper:
456 """Temporary file wrapper
457
458 This class provides a wrapper around files opened for
459 temporary use. In particular, it seeks to automatically
460 remove the file when it is no longer needed.
461 """
462
463 def __init__(self, file, name, delete=True):
464 self.file = file
465 self.name = name
466 self.delete = delete
467 self._closer = _TemporaryFileCloser(file, name, delete)
468
469 def __getattr__(self, name):
470 # Attribute lookups are delegated to the underlying file
471 # and cached for non-numeric results
472 # (i.e. methods are cached, closed and friends are not)
473 file = self.__dict__['file']
474 a = getattr(file, name)
475 if hasattr(a, '__call__'):
476 func = a
477 @_functools.wraps(func)
478 def func_wrapper(*args, **kwargs):
479 return func(*args, **kwargs)
480 # Avoid closing the file as long as the wrapper is alive,
481 # see issue #18879.
482 func_wrapper._closer = self._closer
483 a = func_wrapper
484 if not isinstance(a, int):
485 setattr(self, name, a)
486 return a
487
488 # The underlying __enter__ method returns the wrong object
489 # (self.file) so override it to return the wrapper
490 def __enter__(self):
491 self.file.__enter__()
492 return self
493
494 # Need to trap __exit__ as well to ensure the file gets
495 # deleted when used in a with statement
496 def __exit__(self, exc, value, tb):
497 result = self.file.__exit__(exc, value, tb)
498 self.close()
499 return result
500
501 def close(self):
502 """
503 Close the temporary file, possibly deleting it.
504 """
505 self._closer.close()
506
507 # iter() doesn't use __getattr__ to find the __iter__ method
508 def __iter__(self):
Serhiy Storchakad83b7c22015-03-20 16:11:20 +0200509 # Don't return iter(self.file), but yield from it to avoid closing
R David Murray75ed90a2015-03-22 12:33:46 -0400510 # file as long as it's being used as iterator (see issue #23700). We
511 # can't use 'yield from' here because iter(file) returns the file
512 # object itself, which has a close method, and thus the file would get
513 # closed when the generator is finalized, due to PEP380 semantics.
Serhiy Storchakad83b7c22015-03-20 16:11:20 +0200514 for line in self.file:
515 yield line
Christian Heimes3ecfea712008-02-09 20:51:34 +0000516
517
Guido van Rossumf0c74162007-08-28 03:29:45 +0000518def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
Gregory P. Smithad577b92015-05-22 16:18:14 -0700519 newline=None, suffix=None, prefix=None,
Guido van Rossumf0c74162007-08-28 03:29:45 +0000520 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000521 """Create and return a temporary file.
522 Arguments:
523 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000524 'mode' -- the mode argument to io.open (default "w+b").
525 'buffering' -- the buffer size argument to io.open (default -1).
526 'encoding' -- the encoding argument to io.open (default None)
527 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000528 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000529 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000530
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000531 Returns an object with a file-like interface; the name of the file
Martin Panter1f0e1f32016-02-22 10:10:00 +0000532 is accessible as its 'name' attribute. The file will be automatically
533 deleted when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000534 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000535
Gregory P. Smithad577b92015-05-22 16:18:14 -0700536 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000537
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000538 flags = _bin_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000539
Guido van Rossum0e548712002-08-09 16:14:33 +0000540 # Setting O_TEMPORARY in the flags causes the OS to delete
541 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000542 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000543 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000544
Gregory P. Smithad577b92015-05-22 16:18:14 -0700545 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100546 try:
547 file = _io.open(fd, mode, buffering=buffering,
548 newline=newline, encoding=encoding)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000549
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100550 return _TemporaryFileWrapper(file, name, delete)
Martin Panter7869a222016-02-28 05:22:20 +0000551 except BaseException:
552 _os.unlink(name)
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100553 _os.close(fd)
554 raise
Guido van Rossum0e548712002-08-09 16:14:33 +0000555
Jason Tishler80c02af2002-08-14 15:10:09 +0000556if _os.name != 'posix' or _os.sys.platform == 'cygwin':
557 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
558 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000559 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000560
561else:
Victor Stinnerd967fc92014-06-05 14:27:45 +0200562 # Is the O_TMPFILE flag available and does it work?
563 # The flag is set to False if os.open(dir, os.O_TMPFILE) raises an
564 # IsADirectoryError exception
565 _O_TMPFILE_WORKS = hasattr(_os, 'O_TMPFILE')
566
Guido van Rossumf0c74162007-08-28 03:29:45 +0000567 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
Gregory P. Smithad577b92015-05-22 16:18:14 -0700568 newline=None, suffix=None, prefix=None,
Guido van Rossumf0c74162007-08-28 03:29:45 +0000569 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000570 """Create and return a temporary file.
571 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000572 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000573 'mode' -- the mode argument to io.open (default "w+b").
574 'buffering' -- the buffer size argument to io.open (default -1).
575 'encoding' -- the encoding argument to io.open (default None)
576 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000577 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000578
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000579 Returns an object with a file-like interface. The file has no
580 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000581 """
Victor Stinnerd967fc92014-06-05 14:27:45 +0200582 global _O_TMPFILE_WORKS
Guido van Rossum0e548712002-08-09 16:14:33 +0000583
Gregory P. Smithad577b92015-05-22 16:18:14 -0700584 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000585
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000586 flags = _bin_openflags
Victor Stinnerd967fc92014-06-05 14:27:45 +0200587 if _O_TMPFILE_WORKS:
588 try:
589 flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT
590 fd = _os.open(dir, flags2, 0o600)
591 except IsADirectoryError:
Victor Stinner9aba8c82015-10-21 00:15:08 +0200592 # Linux kernel older than 3.11 ignores the O_TMPFILE flag:
593 # O_TMPFILE is read as O_DIRECTORY. Trying to open a directory
594 # with O_RDWR|O_DIRECTORY fails with IsADirectoryError, a
595 # directory cannot be open to write. Set flag to False to not
596 # try again.
Victor Stinnerd967fc92014-06-05 14:27:45 +0200597 _O_TMPFILE_WORKS = False
598 except OSError:
599 # The filesystem of the directory does not support O_TMPFILE.
600 # For example, OSError(95, 'Operation not supported').
Victor Stinner9aba8c82015-10-21 00:15:08 +0200601 #
602 # On Linux kernel older than 3.11, trying to open a regular
603 # file (or a symbolic link to a regular file) with O_TMPFILE
604 # fails with NotADirectoryError, because O_TMPFILE is read as
605 # O_DIRECTORY.
Victor Stinnerd967fc92014-06-05 14:27:45 +0200606 pass
607 else:
608 try:
609 return _io.open(fd, mode, buffering=buffering,
610 newline=newline, encoding=encoding)
611 except:
612 _os.close(fd)
613 raise
614 # Fallback to _mkstemp_inner().
Guido van Rossum0e548712002-08-09 16:14:33 +0000615
Gregory P. Smithad577b92015-05-22 16:18:14 -0700616 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Guido van Rossum0e548712002-08-09 16:14:33 +0000617 try:
618 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000619 return _io.open(fd, mode, buffering=buffering,
620 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000621 except:
622 _os.close(fd)
623 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000624
625class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200626 """Temporary file wrapper, specialized to switch from BytesIO
627 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000628 when a fileno is needed.
629 """
630 _rolled = False
631
Guido van Rossumf0c74162007-08-28 03:29:45 +0000632 def __init__(self, max_size=0, mode='w+b', buffering=-1,
633 encoding=None, newline=None,
Gregory P. Smithad577b92015-05-22 16:18:14 -0700634 suffix=None, prefix=None, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000635 if 'b' in mode:
636 self._file = _io.BytesIO()
637 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000638 # Setting newline="\n" avoids newline translation;
639 # this is important because otherwise on Windows we'd
Yury Selivanov0b866602014-09-26 17:08:21 -0400640 # get double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000641 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000642 self._max_size = max_size
643 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000644 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
645 'suffix': suffix, 'prefix': prefix,
646 'encoding': encoding, 'newline': newline,
647 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000648
649 def _check(self, file):
650 if self._rolled: return
651 max_size = self._max_size
652 if max_size and file.tell() > max_size:
653 self.rollover()
654
655 def rollover(self):
656 if self._rolled: return
657 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000658 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000659 del self._TemporaryFileArgs
660
661 newfile.write(file.getvalue())
662 newfile.seek(file.tell(), 0)
663
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):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200693 try:
694 return self._file.encoding
695 except AttributeError:
696 if 'b' in self._TemporaryFileArgs['mode']:
697 raise
698 return self._TemporaryFileArgs['encoding']
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):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200726 try:
727 return self._file.newlines
728 except AttributeError:
729 if 'b' in self._TemporaryFileArgs['mode']:
730 raise
731 return self._TemporaryFileArgs['newline']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000732
733 def read(self, *args):
734 return self._file.read(*args)
735
736 def readline(self, *args):
737 return self._file.readline(*args)
738
739 def readlines(self, *args):
740 return self._file.readlines(*args)
741
742 def seek(self, *args):
743 self._file.seek(*args)
744
745 @property
746 def softspace(self):
747 return self._file.softspace
748
749 def tell(self):
750 return self._file.tell()
751
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100752 def truncate(self, size=None):
753 if size is None:
754 self._file.truncate()
755 else:
756 if size > self._max_size:
757 self.rollover()
758 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000759
760 def write(self, s):
761 file = self._file
762 rv = file.write(s)
763 self._check(file)
764 return rv
765
766 def writelines(self, iterable):
767 file = self._file
768 rv = file.writelines(iterable)
769 self._check(file)
770 return rv
771
Nick Coghlan543af752010-10-24 11:23:25 +0000772
773class TemporaryDirectory(object):
774 """Create and return a temporary directory. This has the same
775 behavior as mkdtemp but can be used as a context manager. For
776 example:
777
778 with TemporaryDirectory() as tmpdir:
779 ...
780
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300781 Upon exiting the context, the directory and everything contained
Nick Coghlan543af752010-10-24 11:23:25 +0000782 in it are removed.
783 """
784
Gregory P. Smithad577b92015-05-22 16:18:14 -0700785 def __init__(self, suffix=None, prefix=None, dir=None):
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000786 self.name = mkdtemp(suffix, prefix, dir)
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200787 self._finalizer = _weakref.finalize(
788 self, self._cleanup, self.name,
789 warn_message="Implicitly cleaning up {!r}".format(self))
790
791 @classmethod
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300792 def _cleanup(cls, name, warn_message):
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200793 _shutil.rmtree(name)
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300794 _warnings.warn(warn_message, ResourceWarning)
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200795
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000796 def __repr__(self):
797 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000798
799 def __enter__(self):
800 return self.name
801
Nick Coghlan543af752010-10-24 11:23:25 +0000802 def __exit__(self, exc, value, tb):
803 self.cleanup()
804
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200805 def cleanup(self):
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300806 if self._finalizer.detach():
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200807 _shutil.rmtree(self.name)