blob: 61462357c7283e13716b6a3fe431b7ca64b11a3d [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
Guido van Rossum0e548712002-08-09 16:14:33 +000047
Guido van Rossumd8faa362007-04-27 19:54:29 +000048try:
Georg Brandl2067bfd2008-05-25 13:05:15 +000049 import _thread
Brett Cannoncd171c82013-07-04 17:43:24 -040050except ImportError:
Georg Brandl2067bfd2008-05-25 13:05:15 +000051 import _dummy_thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000052_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000053
54_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000055if hasattr(_os, 'O_NOFOLLOW'):
56 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000057
58_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000059if hasattr(_os, 'O_BINARY'):
60 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000061
62if hasattr(_os, 'TMP_MAX'):
63 TMP_MAX = _os.TMP_MAX
64else:
65 TMP_MAX = 10000
66
Gregory P. Smithad577b92015-05-22 16:18:14 -070067# This variable _was_ unused for legacy reasons, see issue 10354.
68# But as of 3.5 we actually use it at runtime so changing it would
69# have a possibly desirable side effect... But we do not want to support
70# that as an API. It is undocumented on purpose. Do not depend on this.
Tim Petersbd7b4c72002-08-13 23:33:56 +000071template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000072
Guido van Rossum0e548712002-08-09 16:14:33 +000073# Internal routines.
74
75_once_lock = _allocate_lock()
76
Guido van Rossumb256159392003-11-10 02:16:36 +000077if hasattr(_os, "lstat"):
78 _stat = _os.lstat
79elif hasattr(_os, "stat"):
80 _stat = _os.stat
81else:
Florent Xicluna68f71a32011-10-28 16:06:23 +020082 # Fallback. All we need is something that raises OSError if the
Guido van Rossumb256159392003-11-10 02:16:36 +000083 # file doesn't exist.
84 def _stat(fn):
Victor Stinnerdaf45552013-08-28 00:53:59 +020085 fd = _os.open(fn, _os.O_RDONLY)
Victor Stinner69b1e262014-03-20 08:50:52 +010086 _os.close(fd)
Guido van Rossumb256159392003-11-10 02:16:36 +000087
88def _exists(fn):
89 try:
90 _stat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020091 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +000092 return False
93 else:
94 return True
95
Gregory P. Smithad577b92015-05-22 16:18:14 -070096
97def _infer_return_type(*args):
98 """Look at the type of all args and divine their implied return type."""
99 return_type = None
100 for arg in args:
101 if arg is None:
102 continue
103 if isinstance(arg, bytes):
104 if return_type is str:
105 raise TypeError("Can't mix bytes and non-bytes in "
106 "path components.")
107 return_type = bytes
108 else:
109 if return_type is bytes:
110 raise TypeError("Can't mix bytes and non-bytes in "
111 "path components.")
112 return_type = str
113 if return_type is None:
114 return str # tempfile APIs return a str by default.
115 return return_type
116
117
118def _sanitize_params(prefix, suffix, dir):
119 """Common parameter processing for most APIs in this module."""
120 output_type = _infer_return_type(prefix, suffix, dir)
121 if suffix is None:
122 suffix = output_type()
123 if prefix is None:
124 if output_type is str:
125 prefix = template
126 else:
127 prefix = _os.fsencode(template)
128 if dir is None:
129 if output_type is str:
130 dir = gettempdir()
131 else:
132 dir = gettempdirb()
133 return prefix, suffix, dir, output_type
134
135
Guido van Rossum0e548712002-08-09 16:14:33 +0000136class _RandomNameSequence:
137 """An instance of _RandomNameSequence generates an endless
138 sequence of unpredictable strings which can safely be incorporated
139 into file names. Each string is six characters long. Multiple
140 threads can safely use the same instance at the same time.
141
142 _RandomNameSequence is an iterator."""
143
Raymond Hettinger572895b2010-11-09 03:43:58 +0000144 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Guido van Rossum0e548712002-08-09 16:14:33 +0000145
Antoine Pitrou4558bad2011-11-25 21:28:15 +0100146 @property
147 def rng(self):
148 cur_pid = _os.getpid()
149 if cur_pid != getattr(self, '_rng_pid', None):
150 self._rng = _Random()
151 self._rng_pid = cur_pid
152 return self._rng
Tim Peters97701b52002-11-21 15:59:59 +0000153
Guido van Rossum0e548712002-08-09 16:14:33 +0000154 def __iter__(self):
155 return self
156
Georg Brandla18af4e2007-04-21 15:47:16 +0000157 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000158 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000159 choose = self.rng.choice
Victor Stinner97869102013-08-14 01:28:28 +0200160 letters = [choose(c) for dummy in range(8)]
Raymond Hettinger572895b2010-11-09 03:43:58 +0000161 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000162
163def _candidate_tempdir_list():
164 """Generate a list of candidate temporary directories which
165 _get_default_tempdir will try."""
166
167 dirlist = []
168
169 # First, try the environment.
170 for envname in 'TMPDIR', 'TEMP', 'TMP':
171 dirname = _os.getenv(envname)
172 if dirname: dirlist.append(dirname)
173
174 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000175 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000176 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
177 else:
178 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
179
180 # As a last resort, the current directory.
181 try:
182 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200183 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000184 dirlist.append(_os.curdir)
185
186 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000187
Guido van Rossum0e548712002-08-09 16:14:33 +0000188def _get_default_tempdir():
189 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000190 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000191
192 We determine whether or not a candidate temp dir is usable by
193 trying to create and write to a file in that directory. If this
194 is successful, the test file is deleted. To prevent denial of
195 service, the name of the test file must be randomized."""
196
197 namer = _RandomNameSequence()
198 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000199
200 for dir in dirlist:
201 if dir != _os.curdir:
Tim Golden6d09f092013-10-25 18:38:16 +0100202 dir = _os.path.abspath(dir)
Guido van Rossum0e548712002-08-09 16:14:33 +0000203 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000204 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000205 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000206 filename = _os.path.join(dir, name)
207 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000208 fd = _os.open(filename, _bin_openflags, 0o600)
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200209 try:
210 try:
Serhiy Storchaka76a2ed12013-02-13 00:59:26 +0200211 with _io.open(fd, 'wb', closefd=False) as fp:
212 fp.write(b'blat')
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200213 finally:
214 _os.close(fd)
215 finally:
216 _os.unlink(filename)
Guido van Rossum0e548712002-08-09 16:14:33 +0000217 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200218 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000219 pass
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300220 except PermissionError:
221 # This exception is thrown when a directory with the chosen name
222 # already exists on windows.
223 if (_os.name == 'nt' and _os.path.isdir(dir) and
224 _os.access(dir, _os.W_OK)):
225 continue
226 break # no point trying more names in this directory
Florent Xicluna68f71a32011-10-28 16:06:23 +0200227 except OSError:
228 break # no point trying more names in this directory
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200229 raise FileNotFoundError(_errno.ENOENT,
230 "No usable temporary directory found in %s" %
231 dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000232
Guido van Rossume888cdc2002-08-17 14:50:24 +0000233_name_sequence = None
234
Guido van Rossum0e548712002-08-09 16:14:33 +0000235def _get_candidate_names():
236 """Common setup sequence for all user-callable interfaces."""
237
Guido van Rossume888cdc2002-08-17 14:50:24 +0000238 global _name_sequence
239 if _name_sequence is None:
240 _once_lock.acquire()
241 try:
242 if _name_sequence is None:
243 _name_sequence = _RandomNameSequence()
244 finally:
245 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000246 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000247
248
Gregory P. Smithad577b92015-05-22 16:18:14 -0700249def _mkstemp_inner(dir, pre, suf, flags, output_type):
Guido van Rossum0e548712002-08-09 16:14:33 +0000250 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000251
Guido van Rossum0e548712002-08-09 16:14:33 +0000252 names = _get_candidate_names()
Gregory P. Smithad577b92015-05-22 16:18:14 -0700253 if output_type is bytes:
254 names = map(_os.fsencode, names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000255
Guido van Rossum805365e2007-05-07 22:24:25 +0000256 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000257 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000258 file = _os.path.join(dir, pre + name + suf)
259 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000260 fd = _os.open(file, flags, 0o600)
Florent Xicluna68f71a32011-10-28 16:06:23 +0200261 except FileExistsError:
262 continue # try again
Eli Benderskyf315df32013-09-06 06:11:19 -0700263 except PermissionError:
264 # This exception is thrown when a directory with the chosen name
265 # already exists on windows.
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300266 if (_os.name == 'nt' and _os.path.isdir(dir) and
267 _os.access(dir, _os.W_OK)):
Eli Benderskyf315df32013-09-06 06:11:19 -0700268 continue
269 else:
270 raise
Gregory P. Smithad577b92015-05-22 16:18:14 -0700271 return (fd, _os.path.abspath(file))
Guido van Rossum0e548712002-08-09 16:14:33 +0000272
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200273 raise FileExistsError(_errno.EEXIST,
274 "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000275
Guido van Rossum0e548712002-08-09 16:14:33 +0000276
277# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000278
Guido van Rossum41f95031992-03-31 19:02:01 +0000279def gettempprefix():
Gregory P. Smithad577b92015-05-22 16:18:14 -0700280 """The default prefix for temporary directories."""
Guido van Rossum0e548712002-08-09 16:14:33 +0000281 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000282
Gregory P. Smithad577b92015-05-22 16:18:14 -0700283def gettempprefixb():
284 """The default prefix for temporary directories as bytes."""
285 return _os.fsencode(gettempprefix())
286
Guido van Rossume888cdc2002-08-17 14:50:24 +0000287tempdir = None
288
Guido van Rossum0e548712002-08-09 16:14:33 +0000289def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000290 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000291 global tempdir
292 if tempdir is None:
293 _once_lock.acquire()
294 try:
295 if tempdir is None:
296 tempdir = _get_default_tempdir()
297 finally:
298 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000299 return tempdir
300
Gregory P. Smithad577b92015-05-22 16:18:14 -0700301def gettempdirb():
302 """A bytes version of tempfile.gettempdir()."""
303 return _os.fsencode(gettempdir())
304
305def mkstemp(suffix=None, prefix=None, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000306 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000307 file. The return value is a pair (fd, name) where fd is the
308 file descriptor returned by os.open, and name is the filename.
309
Martin Panter9b566c32015-11-07 00:32:50 +0000310 If 'suffix' is not None, the file name will end with that suffix,
Guido van Rossum0e548712002-08-09 16:14:33 +0000311 otherwise there will be no suffix.
312
Martin Panter9b566c32015-11-07 00:32:50 +0000313 If 'prefix' is not None, the file name will begin with that prefix,
Guido van Rossum0e548712002-08-09 16:14:33 +0000314 otherwise a default prefix is used.
315
Martin Panter9b566c32015-11-07 00:32:50 +0000316 If 'dir' is not None, the file will be created in that directory,
Guido van Rossum0e548712002-08-09 16:14:33 +0000317 otherwise a default directory is used.
318
Tim Peters04490bf2002-08-14 15:41:26 +0000319 If 'text' is specified and true, the file is opened in text
320 mode. Else (the default) the file is opened in binary mode. On
321 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000322
Martin Panter9b566c32015-11-07 00:32:50 +0000323 If any of 'suffix', 'prefix' and 'dir' are not None, they must be the
324 same type. If they are bytes, the returned name will be bytes; str
325 otherwise.
Gregory P. Smithad577b92015-05-22 16:18:14 -0700326
Guido van Rossum0e548712002-08-09 16:14:33 +0000327 The file is readable and writable only by the creating user ID.
328 If the operating system uses permission bits to indicate whether a
329 file is executable, the file is executable by no one. The file
330 descriptor is not inherited by children of this process.
331
332 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000333 """
334
Gregory P. Smithad577b92015-05-22 16:18:14 -0700335 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000336
Tim Peters04490bf2002-08-14 15:41:26 +0000337 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000338 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000339 else:
340 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000341
Gregory P. Smithad577b92015-05-22 16:18:14 -0700342 return _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Guido van Rossumcff34541992-01-14 18:31:56 +0000343
Guido van Rossumeee94981991-11-12 15:38:08 +0000344
Gregory P. Smithad577b92015-05-22 16:18:14 -0700345def mkdtemp(suffix=None, prefix=None, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000346 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000347 directory. The return value is the pathname of the directory.
348
Tim Peters04490bf2002-08-14 15:41:26 +0000349 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000350 not accepted.
351
352 The directory is readable, writable, and searchable only by the
353 creating user.
354
355 Caller is responsible for deleting the directory when done with it.
356 """
357
Gregory P. Smithad577b92015-05-22 16:18:14 -0700358 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000359
Guido van Rossum0e548712002-08-09 16:14:33 +0000360 names = _get_candidate_names()
Gregory P. Smithad577b92015-05-22 16:18:14 -0700361 if output_type is bytes:
362 names = map(_os.fsencode, names)
Tim Petersa0d55de2002-08-09 18:01:01 +0000363
Guido van Rossum805365e2007-05-07 22:24:25 +0000364 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000365 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000366 file = _os.path.join(dir, prefix + name + suffix)
367 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000368 _os.mkdir(file, 0o700)
Florent Xicluna68f71a32011-10-28 16:06:23 +0200369 except FileExistsError:
370 continue # try again
Serhiy Storchaka5d6b7b12015-05-20 00:11:48 +0300371 except PermissionError:
372 # This exception is thrown when a directory with the chosen name
373 # already exists on windows.
374 if (_os.name == 'nt' and _os.path.isdir(dir) and
375 _os.access(dir, _os.W_OK)):
376 continue
377 else:
378 raise
Gregory P. Smithad577b92015-05-22 16:18:14 -0700379 return file
Guido van Rossum0e548712002-08-09 16:14:33 +0000380
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200381 raise FileExistsError(_errno.EEXIST,
382 "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000383
Guido van Rossume888cdc2002-08-17 14:50:24 +0000384def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000385 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000386 file is not created.
387
Martin Panter9b566c32015-11-07 00:32:50 +0000388 Arguments are similar to mkstemp, except that the 'text' argument is
389 not accepted, and suffix=None, prefix=None and bytes file names are not
390 supported.
Guido van Rossum0e548712002-08-09 16:14:33 +0000391
Gregory P. Smithad577b92015-05-22 16:18:14 -0700392 THIS FUNCTION IS UNSAFE AND SHOULD NOT BE USED. The file name may
393 refer to a file that did not exist at some point, but by the time
Guido van Rossum0e548712002-08-09 16:14:33 +0000394 you get around to creating it, someone else may have beaten you to
395 the punch.
396 """
397
Guido van Rossum44f602d2002-11-22 15:56:29 +0000398## from warnings import warn as _warn
399## _warn("mktemp is a potential security risk to your program",
400## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000401
Guido van Rossume888cdc2002-08-17 14:50:24 +0000402 if dir is None:
403 dir = gettempdir()
404
Guido van Rossum0e548712002-08-09 16:14:33 +0000405 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000406 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000407 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000408 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000409 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000410 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000411
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200412 raise FileExistsError(_errno.EEXIST,
413 "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000414
Christian Heimes3ecfea712008-02-09 20:51:34 +0000415
Antoine Pitrou17c93262013-12-21 22:14:56 +0100416class _TemporaryFileCloser:
417 """A separate object allowing proper closing of a temporary file's
418 underlying file object, without adding a __del__ method to the
419 temporary file."""
Tim Petersa255a722001-12-18 22:32:40 +0000420
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200421 file = None # Set here since __del__ checks it
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200422 close_called = False
423
Guido van Rossumd8faa362007-04-27 19:54:29 +0000424 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000425 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000426 self.name = name
Guido van Rossumd8faa362007-04-27 19:54:29 +0000427 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000428
Guido van Rossum0e548712002-08-09 16:14:33 +0000429 # NT provides delete-on-close as a primitive, so we don't need
430 # the wrapper to do anything special. We still use it so that
431 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
432 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000433 # Cache the unlinker so we don't get spurious errors at
434 # shutdown when the module-level "os" is None'd out. Note
435 # that this must be referenced as self.unlink, because the
436 # name TemporaryFileWrapper may also get None'd out before
437 # __del__ is called.
Tim Peters1baa22a2001-01-12 10:02:46 +0000438
Serhiy Storchaka99e033b2014-01-27 11:18:27 +0200439 def close(self, unlink=_os.unlink):
440 if not self.close_called and self.file is not None:
Tim Peters6ef966e2002-11-21 15:48:33 +0000441 self.close_called = True
Serhiy Storchaka7e7a3db2015-04-10 13:24:41 +0300442 try:
443 self.file.close()
444 finally:
445 if self.delete:
446 unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000447
Antoine Pitrou17c93262013-12-21 22:14:56 +0100448 # Need to ensure the file is deleted on __del__
Guido van Rossum0e548712002-08-09 16:14:33 +0000449 def __del__(self):
450 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000451
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000452 else:
Antoine Pitrou17c93262013-12-21 22:14:56 +0100453 def close(self):
454 if not self.close_called:
455 self.close_called = True
456 self.file.close()
457
458
459class _TemporaryFileWrapper:
460 """Temporary file wrapper
461
462 This class provides a wrapper around files opened for
463 temporary use. In particular, it seeks to automatically
464 remove the file when it is no longer needed.
465 """
466
467 def __init__(self, file, name, delete=True):
468 self.file = file
469 self.name = name
470 self.delete = delete
471 self._closer = _TemporaryFileCloser(file, name, delete)
472
473 def __getattr__(self, name):
474 # Attribute lookups are delegated to the underlying file
475 # and cached for non-numeric results
476 # (i.e. methods are cached, closed and friends are not)
477 file = self.__dict__['file']
478 a = getattr(file, name)
479 if hasattr(a, '__call__'):
480 func = a
481 @_functools.wraps(func)
482 def func_wrapper(*args, **kwargs):
483 return func(*args, **kwargs)
484 # Avoid closing the file as long as the wrapper is alive,
485 # see issue #18879.
486 func_wrapper._closer = self._closer
487 a = func_wrapper
488 if not isinstance(a, int):
489 setattr(self, name, a)
490 return a
491
492 # The underlying __enter__ method returns the wrong object
493 # (self.file) so override it to return the wrapper
494 def __enter__(self):
495 self.file.__enter__()
496 return self
497
498 # Need to trap __exit__ as well to ensure the file gets
499 # deleted when used in a with statement
500 def __exit__(self, exc, value, tb):
501 result = self.file.__exit__(exc, value, tb)
502 self.close()
503 return result
504
505 def close(self):
506 """
507 Close the temporary file, possibly deleting it.
508 """
509 self._closer.close()
510
511 # iter() doesn't use __getattr__ to find the __iter__ method
512 def __iter__(self):
Serhiy Storchakad83b7c22015-03-20 16:11:20 +0200513 # Don't return iter(self.file), but yield from it to avoid closing
R David Murray75ed90a2015-03-22 12:33:46 -0400514 # file as long as it's being used as iterator (see issue #23700). We
515 # can't use 'yield from' here because iter(file) returns the file
516 # object itself, which has a close method, and thus the file would get
517 # closed when the generator is finalized, due to PEP380 semantics.
Serhiy Storchakad83b7c22015-03-20 16:11:20 +0200518 for line in self.file:
519 yield line
Christian Heimes3ecfea712008-02-09 20:51:34 +0000520
521
Guido van Rossumf0c74162007-08-28 03:29:45 +0000522def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
Gregory P. Smithad577b92015-05-22 16:18:14 -0700523 newline=None, suffix=None, prefix=None,
Guido van Rossumf0c74162007-08-28 03:29:45 +0000524 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000525 """Create and return a temporary file.
526 Arguments:
527 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000528 'mode' -- the mode argument to io.open (default "w+b").
529 'buffering' -- the buffer size argument to io.open (default -1).
530 'encoding' -- the encoding argument to io.open (default None)
531 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000532 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000533 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000534
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000535 Returns an object with a file-like interface; the name of the file
Martin Panter1f0e1f32016-02-22 10:10:00 +0000536 is accessible as its 'name' attribute. The file will be automatically
537 deleted when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000538 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000539
Gregory P. Smithad577b92015-05-22 16:18:14 -0700540 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000541
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000542 flags = _bin_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000543
Guido van Rossum0e548712002-08-09 16:14:33 +0000544 # Setting O_TEMPORARY in the flags causes the OS to delete
545 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000546 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000547 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000548
Gregory P. Smithad577b92015-05-22 16:18:14 -0700549 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100550 try:
551 file = _io.open(fd, mode, buffering=buffering,
552 newline=newline, encoding=encoding)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000553
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100554 return _TemporaryFileWrapper(file, name, delete)
Martin Panter7869a222016-02-28 05:22:20 +0000555 except BaseException:
556 _os.unlink(name)
Victor Stinner1f99f9d2014-03-25 09:18:04 +0100557 _os.close(fd)
558 raise
Guido van Rossum0e548712002-08-09 16:14:33 +0000559
Jason Tishler80c02af2002-08-14 15:10:09 +0000560if _os.name != 'posix' or _os.sys.platform == 'cygwin':
561 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
562 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000563 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000564
565else:
Victor Stinnerd967fc92014-06-05 14:27:45 +0200566 # Is the O_TMPFILE flag available and does it work?
567 # The flag is set to False if os.open(dir, os.O_TMPFILE) raises an
568 # IsADirectoryError exception
569 _O_TMPFILE_WORKS = hasattr(_os, 'O_TMPFILE')
570
Guido van Rossumf0c74162007-08-28 03:29:45 +0000571 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
Gregory P. Smithad577b92015-05-22 16:18:14 -0700572 newline=None, suffix=None, prefix=None,
Guido van Rossumf0c74162007-08-28 03:29:45 +0000573 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000574 """Create and return a temporary file.
575 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000576 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000577 'mode' -- the mode argument to io.open (default "w+b").
578 'buffering' -- the buffer size argument to io.open (default -1).
579 'encoding' -- the encoding argument to io.open (default None)
580 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000581 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000582
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000583 Returns an object with a file-like interface. The file has no
584 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000585 """
Victor Stinnerd967fc92014-06-05 14:27:45 +0200586 global _O_TMPFILE_WORKS
Guido van Rossum0e548712002-08-09 16:14:33 +0000587
Gregory P. Smithad577b92015-05-22 16:18:14 -0700588 prefix, suffix, dir, output_type = _sanitize_params(prefix, suffix, dir)
Guido van Rossume888cdc2002-08-17 14:50:24 +0000589
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000590 flags = _bin_openflags
Victor Stinnerd967fc92014-06-05 14:27:45 +0200591 if _O_TMPFILE_WORKS:
592 try:
593 flags2 = (flags | _os.O_TMPFILE) & ~_os.O_CREAT
594 fd = _os.open(dir, flags2, 0o600)
595 except IsADirectoryError:
Victor Stinner9aba8c82015-10-21 00:15:08 +0200596 # Linux kernel older than 3.11 ignores the O_TMPFILE flag:
597 # O_TMPFILE is read as O_DIRECTORY. Trying to open a directory
598 # with O_RDWR|O_DIRECTORY fails with IsADirectoryError, a
599 # directory cannot be open to write. Set flag to False to not
600 # try again.
Victor Stinnerd967fc92014-06-05 14:27:45 +0200601 _O_TMPFILE_WORKS = False
602 except OSError:
603 # The filesystem of the directory does not support O_TMPFILE.
604 # For example, OSError(95, 'Operation not supported').
Victor Stinner9aba8c82015-10-21 00:15:08 +0200605 #
606 # On Linux kernel older than 3.11, trying to open a regular
607 # file (or a symbolic link to a regular file) with O_TMPFILE
608 # fails with NotADirectoryError, because O_TMPFILE is read as
609 # O_DIRECTORY.
Victor Stinnerd967fc92014-06-05 14:27:45 +0200610 pass
611 else:
612 try:
613 return _io.open(fd, mode, buffering=buffering,
614 newline=newline, encoding=encoding)
615 except:
616 _os.close(fd)
617 raise
618 # Fallback to _mkstemp_inner().
Guido van Rossum0e548712002-08-09 16:14:33 +0000619
Gregory P. Smithad577b92015-05-22 16:18:14 -0700620 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags, output_type)
Guido van Rossum0e548712002-08-09 16:14:33 +0000621 try:
622 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000623 return _io.open(fd, mode, buffering=buffering,
624 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000625 except:
626 _os.close(fd)
627 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000628
629class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200630 """Temporary file wrapper, specialized to switch from BytesIO
631 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000632 when a fileno is needed.
633 """
634 _rolled = False
635
Guido van Rossumf0c74162007-08-28 03:29:45 +0000636 def __init__(self, max_size=0, mode='w+b', buffering=-1,
637 encoding=None, newline=None,
Gregory P. Smithad577b92015-05-22 16:18:14 -0700638 suffix=None, prefix=None, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000639 if 'b' in mode:
640 self._file = _io.BytesIO()
641 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000642 # Setting newline="\n" avoids newline translation;
643 # this is important because otherwise on Windows we'd
Yury Selivanov0b866602014-09-26 17:08:21 -0400644 # get double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000645 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000646 self._max_size = max_size
647 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000648 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
649 'suffix': suffix, 'prefix': prefix,
650 'encoding': encoding, 'newline': newline,
651 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000652
653 def _check(self, file):
654 if self._rolled: return
655 max_size = self._max_size
656 if max_size and file.tell() > max_size:
657 self.rollover()
658
659 def rollover(self):
660 if self._rolled: return
661 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000662 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000663 del self._TemporaryFileArgs
664
665 newfile.write(file.getvalue())
666 newfile.seek(file.tell(), 0)
667
668 self._rolled = True
669
Christian Heimes3ecfea712008-02-09 20:51:34 +0000670 # The method caching trick from NamedTemporaryFile
671 # won't work here, because _file may change from a
Serhiy Storchaka50254c52013-08-29 11:35:43 +0300672 # BytesIO/StringIO instance to a real file. So we list
Christian Heimes3ecfea712008-02-09 20:51:34 +0000673 # all the methods directly.
674
675 # Context management protocol
676 def __enter__(self):
677 if self._file.closed:
678 raise ValueError("Cannot enter context with closed file")
679 return self
680
681 def __exit__(self, exc, value, tb):
682 self._file.close()
683
Guido van Rossumd8faa362007-04-27 19:54:29 +0000684 # file protocol
685 def __iter__(self):
686 return self._file.__iter__()
687
688 def close(self):
689 self._file.close()
690
691 @property
692 def closed(self):
693 return self._file.closed
694
695 @property
696 def encoding(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200697 try:
698 return self._file.encoding
699 except AttributeError:
700 if 'b' in self._TemporaryFileArgs['mode']:
701 raise
702 return self._TemporaryFileArgs['encoding']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000703
704 def fileno(self):
705 self.rollover()
706 return self._file.fileno()
707
708 def flush(self):
709 self._file.flush()
710
711 def isatty(self):
712 return self._file.isatty()
713
714 @property
715 def mode(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200716 try:
717 return self._file.mode
718 except AttributeError:
719 return self._TemporaryFileArgs['mode']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000720
721 @property
722 def name(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200723 try:
724 return self._file.name
725 except AttributeError:
726 return None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000727
728 @property
729 def newlines(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200730 try:
731 return self._file.newlines
732 except AttributeError:
733 if 'b' in self._TemporaryFileArgs['mode']:
734 raise
735 return self._TemporaryFileArgs['newline']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000736
737 def read(self, *args):
738 return self._file.read(*args)
739
740 def readline(self, *args):
741 return self._file.readline(*args)
742
743 def readlines(self, *args):
744 return self._file.readlines(*args)
745
746 def seek(self, *args):
747 self._file.seek(*args)
748
749 @property
750 def softspace(self):
751 return self._file.softspace
752
753 def tell(self):
754 return self._file.tell()
755
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100756 def truncate(self, size=None):
757 if size is None:
758 self._file.truncate()
759 else:
760 if size > self._max_size:
761 self.rollover()
762 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000763
764 def write(self, s):
765 file = self._file
766 rv = file.write(s)
767 self._check(file)
768 return rv
769
770 def writelines(self, iterable):
771 file = self._file
772 rv = file.writelines(iterable)
773 self._check(file)
774 return rv
775
Nick Coghlan543af752010-10-24 11:23:25 +0000776
777class TemporaryDirectory(object):
778 """Create and return a temporary directory. This has the same
779 behavior as mkdtemp but can be used as a context manager. For
780 example:
781
782 with TemporaryDirectory() as tmpdir:
783 ...
784
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300785 Upon exiting the context, the directory and everything contained
Nick Coghlan543af752010-10-24 11:23:25 +0000786 in it are removed.
787 """
788
Gregory P. Smithad577b92015-05-22 16:18:14 -0700789 def __init__(self, suffix=None, prefix=None, dir=None):
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000790 self.name = mkdtemp(suffix, prefix, dir)
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200791 self._finalizer = _weakref.finalize(
792 self, self._cleanup, self.name,
793 warn_message="Implicitly cleaning up {!r}".format(self))
794
795 @classmethod
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300796 def _cleanup(cls, name, warn_message):
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200797 _shutil.rmtree(name)
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300798 _warnings.warn(warn_message, ResourceWarning)
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200799
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000800 def __repr__(self):
801 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000802
803 def __enter__(self):
804 return self.name
805
Nick Coghlan543af752010-10-24 11:23:25 +0000806 def __exit__(self, exc, value, tb):
807 self.cleanup()
808
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200809 def cleanup(self):
Serhiy Storchaka5e193ac2014-09-24 13:26:25 +0300810 if self._finalizer.detach():
Serhiy Storchakaa28632b2014-01-27 11:21:54 +0200811 _shutil.rmtree(self.name)