blob: 3ec6b4a3da9f9a0968cf07f554507709c8299d4e [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
4creating temporary files and directories. The interfaces listed
5as "safe" just below can be used without fear of race conditions.
6Those listed as "unsafe" cannot, and are provided for backward
7compatibility only.
Guido van Rossumeee94981991-11-12 15:38:08 +00008
Guido van Rossum0e548712002-08-09 16:14:33 +00009This module also provides some data items to the user:
Guido van Rossumeee94981991-11-12 15:38:08 +000010
Guido van Rossum0e548712002-08-09 16:14:33 +000011 TMP_MAX - maximum number of names that will be tried before
12 giving up.
Guido van Rossum0e548712002-08-09 16:14:33 +000013 tempdir - If this is set to a string before the first use of
14 any routine from this module, it will be considered as
15 another candidate location to store temporary files.
16"""
Skip Montanaro40fc1602001-03-01 04:27:19 +000017
Guido van Rossum0e548712002-08-09 16:14:33 +000018__all__ = [
19 "NamedTemporaryFile", "TemporaryFile", # high level safe interfaces
Nick Coghlan543af752010-10-24 11:23:25 +000020 "SpooledTemporaryFile", "TemporaryDirectory",
Guido van Rossum0e548712002-08-09 16:14:33 +000021 "mkstemp", "mkdtemp", # low level safe interfaces
22 "mktemp", # deprecated unsafe interface
23 "TMP_MAX", "gettempprefix", # constants
24 "tempdir", "gettempdir"
25 ]
Guido van Rossum41f95031992-03-31 19:02:01 +000026
Tim Peters4fd5a062002-01-28 23:11:23 +000027
Guido van Rossum0e548712002-08-09 16:14:33 +000028# Imports.
Tim Peters4fd5a062002-01-28 23:11:23 +000029
Nick Coghlan6b22f3f2010-12-12 15:24:21 +000030import warnings as _warnings
31import sys as _sys
Guido van Rossum9a634702007-07-09 10:24:45 +000032import io as _io
Guido van Rossum0e548712002-08-09 16:14:33 +000033import os as _os
Guido van Rossum0e548712002-08-09 16:14:33 +000034from random import Random as _Random
35
Guido van Rossumd8faa362007-04-27 19:54:29 +000036try:
Guido van Rossum0e548712002-08-09 16:14:33 +000037 import fcntl as _fcntl
Tim Peters90ee7eb2004-07-18 23:58:17 +000038except ImportError:
Tim Peters291f14e2003-07-22 02:50:01 +000039 def _set_cloexec(fd):
40 pass
41else:
Guido van Rossum0e548712002-08-09 16:14:33 +000042 def _set_cloexec(fd):
Tim Peters90ee7eb2004-07-18 23:58:17 +000043 try:
44 flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0)
Florent Xicluna68f71a32011-10-28 16:06:23 +020045 except OSError:
Tim Peters90ee7eb2004-07-18 23:58:17 +000046 pass
Alex Martellif09994e2003-11-09 16:44:09 +000047 else:
Guido van Rossum0e548712002-08-09 16:14:33 +000048 # flags read successfully, modify
49 flags |= _fcntl.FD_CLOEXEC
50 _fcntl.fcntl(fd, _fcntl.F_SETFD, flags)
Tim Peters291f14e2003-07-22 02:50:01 +000051
Guido van Rossum0e548712002-08-09 16:14:33 +000052
53try:
Georg Brandl2067bfd2008-05-25 13:05:15 +000054 import _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000055except ImportError:
Georg Brandl2067bfd2008-05-25 13:05:15 +000056 import _dummy_thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000057_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000058
59_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000060if hasattr(_os, 'O_NOINHERIT'):
61 _text_openflags |= _os.O_NOINHERIT
62if hasattr(_os, 'O_NOFOLLOW'):
63 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000064
65_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000066if hasattr(_os, 'O_BINARY'):
67 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000068
69if hasattr(_os, 'TMP_MAX'):
70 TMP_MAX = _os.TMP_MAX
71else:
72 TMP_MAX = 10000
73
R David Murray3a420c72011-06-22 21:01:13 -040074# Although it does not have an underscore for historical reasons, this
75# variable is an internal implementation detail (see issue 10354).
Tim Petersbd7b4c72002-08-13 23:33:56 +000076template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000077
Guido van Rossum0e548712002-08-09 16:14:33 +000078# Internal routines.
79
80_once_lock = _allocate_lock()
81
Guido van Rossumb256159392003-11-10 02:16:36 +000082if hasattr(_os, "lstat"):
83 _stat = _os.lstat
84elif hasattr(_os, "stat"):
85 _stat = _os.stat
86else:
Florent Xicluna68f71a32011-10-28 16:06:23 +020087 # Fallback. All we need is something that raises OSError if the
Guido van Rossumb256159392003-11-10 02:16:36 +000088 # file doesn't exist.
89 def _stat(fn):
Florent Xicluna46f5d142011-10-28 21:58:56 +020090 f = open(fn)
Guido van Rossumb256159392003-11-10 02:16:36 +000091 f.close()
92
93def _exists(fn):
94 try:
95 _stat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020096 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +000097 return False
98 else:
99 return True
100
Guido van Rossum0e548712002-08-09 16:14:33 +0000101class _RandomNameSequence:
102 """An instance of _RandomNameSequence generates an endless
103 sequence of unpredictable strings which can safely be incorporated
104 into file names. Each string is six characters long. Multiple
105 threads can safely use the same instance at the same time.
106
107 _RandomNameSequence is an iterator."""
108
Raymond Hettinger572895b2010-11-09 03:43:58 +0000109 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Guido van Rossum0e548712002-08-09 16:14:33 +0000110
111 def __init__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000112 self.rng = _Random()
Tim Peters97701b52002-11-21 15:59:59 +0000113
Guido van Rossum0e548712002-08-09 16:14:33 +0000114 def __iter__(self):
115 return self
116
Georg Brandla18af4e2007-04-21 15:47:16 +0000117 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000118 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000119 choose = self.rng.choice
Raymond Hettinger572895b2010-11-09 03:43:58 +0000120 letters = [choose(c) for dummy in "123456"]
121 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000122
123def _candidate_tempdir_list():
124 """Generate a list of candidate temporary directories which
125 _get_default_tempdir will try."""
126
127 dirlist = []
128
129 # First, try the environment.
130 for envname in 'TMPDIR', 'TEMP', 'TMP':
131 dirname = _os.getenv(envname)
132 if dirname: dirlist.append(dirname)
133
134 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000135 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000136 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
137 else:
138 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
139
140 # As a last resort, the current directory.
141 try:
142 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200143 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000144 dirlist.append(_os.curdir)
145
146 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000147
Guido van Rossum0e548712002-08-09 16:14:33 +0000148def _get_default_tempdir():
149 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000150 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000151
152 We determine whether or not a candidate temp dir is usable by
153 trying to create and write to a file in that directory. If this
154 is successful, the test file is deleted. To prevent denial of
155 service, the name of the test file must be randomized."""
156
157 namer = _RandomNameSequence()
158 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000159
160 for dir in dirlist:
161 if dir != _os.curdir:
162 dir = _os.path.normcase(_os.path.abspath(dir))
163 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000164 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000165 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000166 filename = _os.path.join(dir, name)
167 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000168 fd = _os.open(filename, _bin_openflags, 0o600)
Guido van Rossum5424df22007-08-13 19:06:38 +0000169 fp = _io.open(fd, 'wb')
170 fp.write(b'blat')
Tim Petersb90f89a2001-01-15 03:26:36 +0000171 fp.close()
Guido van Rossum0e548712002-08-09 16:14:33 +0000172 _os.unlink(filename)
173 del fp, fd
174 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200175 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000176 pass
Florent Xicluna68f71a32011-10-28 16:06:23 +0200177 except OSError:
178 break # no point trying more names in this directory
179 raise FileNotFoundError("No usable temporary directory found in %s" % dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000180
Guido van Rossume888cdc2002-08-17 14:50:24 +0000181_name_sequence = None
182
Guido van Rossum0e548712002-08-09 16:14:33 +0000183def _get_candidate_names():
184 """Common setup sequence for all user-callable interfaces."""
185
Guido van Rossume888cdc2002-08-17 14:50:24 +0000186 global _name_sequence
187 if _name_sequence is None:
188 _once_lock.acquire()
189 try:
190 if _name_sequence is None:
191 _name_sequence = _RandomNameSequence()
192 finally:
193 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000194 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000195
196
Guido van Rossum0e548712002-08-09 16:14:33 +0000197def _mkstemp_inner(dir, pre, suf, flags):
198 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000199
Guido van Rossum0e548712002-08-09 16:14:33 +0000200 names = _get_candidate_names()
201
Guido van Rossum805365e2007-05-07 22:24:25 +0000202 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000203 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000204 file = _os.path.join(dir, pre + name + suf)
205 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000206 fd = _os.open(file, flags, 0o600)
Guido van Rossum0e548712002-08-09 16:14:33 +0000207 _set_cloexec(fd)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000208 return (fd, _os.path.abspath(file))
Florent Xicluna68f71a32011-10-28 16:06:23 +0200209 except FileExistsError:
210 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000211
Florent Xicluna68f71a32011-10-28 16:06:23 +0200212 raise FileExistsError("No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000213
Guido van Rossum0e548712002-08-09 16:14:33 +0000214
215# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000216
Guido van Rossum41f95031992-03-31 19:02:01 +0000217def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000218 """Accessor for tempdir.template."""
219 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000220
Guido van Rossume888cdc2002-08-17 14:50:24 +0000221tempdir = None
222
Guido van Rossum0e548712002-08-09 16:14:33 +0000223def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000224 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000225 global tempdir
226 if tempdir is None:
227 _once_lock.acquire()
228 try:
229 if tempdir is None:
230 tempdir = _get_default_tempdir()
231 finally:
232 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000233 return tempdir
234
Guido van Rossume888cdc2002-08-17 14:50:24 +0000235def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000236 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000237 file. The return value is a pair (fd, name) where fd is the
238 file descriptor returned by os.open, and name is the filename.
239
240 If 'suffix' is specified, the file name will end with that suffix,
241 otherwise there will be no suffix.
242
243 If 'prefix' is specified, the file name will begin with that prefix,
244 otherwise a default prefix is used.
245
246 If 'dir' is specified, the file will be created in that directory,
247 otherwise a default directory is used.
248
Tim Peters04490bf2002-08-14 15:41:26 +0000249 If 'text' is specified and true, the file is opened in text
250 mode. Else (the default) the file is opened in binary mode. On
251 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000252
253 The file is readable and writable only by the creating user ID.
254 If the operating system uses permission bits to indicate whether a
255 file is executable, the file is executable by no one. The file
256 descriptor is not inherited by children of this process.
257
258 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000259 """
260
Guido van Rossume888cdc2002-08-17 14:50:24 +0000261 if dir is None:
262 dir = gettempdir()
263
Tim Peters04490bf2002-08-14 15:41:26 +0000264 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000265 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000266 else:
267 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000268
269 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000270
Guido van Rossumeee94981991-11-12 15:38:08 +0000271
Guido van Rossume888cdc2002-08-17 14:50:24 +0000272def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000273 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000274 directory. The return value is the pathname of the directory.
275
Tim Peters04490bf2002-08-14 15:41:26 +0000276 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000277 not accepted.
278
279 The directory is readable, writable, and searchable only by the
280 creating user.
281
282 Caller is responsible for deleting the directory when done with it.
283 """
284
Guido van Rossume888cdc2002-08-17 14:50:24 +0000285 if dir is None:
286 dir = gettempdir()
287
Guido van Rossum0e548712002-08-09 16:14:33 +0000288 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000289
Guido van Rossum805365e2007-05-07 22:24:25 +0000290 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000291 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000292 file = _os.path.join(dir, prefix + name + suffix)
293 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000294 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000295 return file
Florent Xicluna68f71a32011-10-28 16:06:23 +0200296 except FileExistsError:
297 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000298
Florent Xicluna68f71a32011-10-28 16:06:23 +0200299 raise FileExistsError("No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000300
Guido van Rossume888cdc2002-08-17 14:50:24 +0000301def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000302 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000303 file is not created.
304
Tim Peters04490bf2002-08-14 15:41:26 +0000305 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000306 not accepted.
307
308 This function is unsafe and should not be used. The file name
309 refers to a file that did not exist at some point, but by the time
310 you get around to creating it, someone else may have beaten you to
311 the punch.
312 """
313
Guido van Rossum44f602d2002-11-22 15:56:29 +0000314## from warnings import warn as _warn
315## _warn("mktemp is a potential security risk to your program",
316## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000317
Guido van Rossume888cdc2002-08-17 14:50:24 +0000318 if dir is None:
319 dir = gettempdir()
320
Guido van Rossum0e548712002-08-09 16:14:33 +0000321 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000322 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000323 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000324 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000325 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000326 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000327
Florent Xicluna68f71a32011-10-28 16:06:23 +0200328 raise FileExistsError("No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000329
Christian Heimes3ecfea712008-02-09 20:51:34 +0000330
Guido van Rossum0e548712002-08-09 16:14:33 +0000331class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000332 """Temporary file wrapper
333
Guido van Rossum0e548712002-08-09 16:14:33 +0000334 This class provides a wrapper around files opened for
335 temporary use. In particular, it seeks to automatically
336 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000337 """
Tim Petersa255a722001-12-18 22:32:40 +0000338
Guido van Rossumd8faa362007-04-27 19:54:29 +0000339 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000340 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000341 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000342 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000343 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000344
Guido van Rossumca549821997-08-12 18:00:12 +0000345 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000346 # Attribute lookups are delegated to the underlying file
347 # and cached for non-numeric results
348 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000349 file = self.__dict__['file']
350 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000351 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000352 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000353 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000354
Christian Heimes3ecfea712008-02-09 20:51:34 +0000355 # The underlying __enter__ method returns the wrong object
356 # (self.file) so override it to return the wrapper
357 def __enter__(self):
358 self.file.__enter__()
359 return self
360
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000361 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000362 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000363 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000364
Guido van Rossum0e548712002-08-09 16:14:33 +0000365 # NT provides delete-on-close as a primitive, so we don't need
366 # the wrapper to do anything special. We still use it so that
367 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
368 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000369 # Cache the unlinker so we don't get spurious errors at
370 # shutdown when the module-level "os" is None'd out. Note
371 # that this must be referenced as self.unlink, because the
372 # name TemporaryFileWrapper may also get None'd out before
373 # __del__ is called.
374 unlink = _os.unlink
Tim Peters1baa22a2001-01-12 10:02:46 +0000375
Guido van Rossum0e548712002-08-09 16:14:33 +0000376 def close(self):
377 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000378 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000379 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000380 if self.delete:
381 self.unlink(self.name)
Tim Peters1baa22a2001-01-12 10:02:46 +0000382
Guido van Rossum0e548712002-08-09 16:14:33 +0000383 def __del__(self):
384 self.close()
Tim Peters1baa22a2001-01-12 10:02:46 +0000385
Christian Heimes3ecfea712008-02-09 20:51:34 +0000386 # Need to trap __exit__ as well to ensure the file gets
387 # deleted when used in a with statement
388 def __exit__(self, exc, value, tb):
389 result = self.file.__exit__(exc, value, tb)
390 self.close()
391 return result
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000392 else:
393 def __exit__(self, exc, value, tb):
Benjamin Peterson3f5de132009-07-01 15:47:07 +0000394 self.file.__exit__(exc, value, tb)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000395
396
Guido van Rossumf0c74162007-08-28 03:29:45 +0000397def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
398 newline=None, suffix="", prefix=template,
399 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000400 """Create and return a temporary file.
401 Arguments:
402 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000403 'mode' -- the mode argument to io.open (default "w+b").
404 'buffering' -- the buffer size argument to io.open (default -1).
405 'encoding' -- the encoding argument to io.open (default None)
406 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000407 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000408 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000409
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000410 Returns an object with a file-like interface; the name of the file
411 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000412 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000413 """
Tim Peters1baa22a2001-01-12 10:02:46 +0000414
Guido van Rossume888cdc2002-08-17 14:50:24 +0000415 if dir is None:
416 dir = gettempdir()
417
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000418 flags = _bin_openflags
Tim Peters1baa22a2001-01-12 10:02:46 +0000419
Guido van Rossum0e548712002-08-09 16:14:33 +0000420 # Setting O_TEMPORARY in the flags causes the OS to delete
421 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000422 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000423 flags |= _os.O_TEMPORARY
Tim Peters1baa22a2001-01-12 10:02:46 +0000424
Guido van Rossum0e548712002-08-09 16:14:33 +0000425 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000426 file = _io.open(fd, mode, buffering=buffering,
427 newline=newline, encoding=encoding)
428
Guido van Rossumd8faa362007-04-27 19:54:29 +0000429 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000430
Jason Tishler80c02af2002-08-14 15:10:09 +0000431if _os.name != 'posix' or _os.sys.platform == 'cygwin':
432 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
433 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000434 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22a2001-01-12 10:02:46 +0000435
436else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000437 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
438 newline=None, suffix="", prefix=template,
439 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000440 """Create and return a temporary file.
441 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000442 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000443 'mode' -- the mode argument to io.open (default "w+b").
444 'buffering' -- the buffer size argument to io.open (default -1).
445 'encoding' -- the encoding argument to io.open (default None)
446 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000447 The file is created as mkstemp() would do it.
Tim Peters1baa22a2001-01-12 10:02:46 +0000448
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000449 Returns an object with a file-like interface. The file has no
450 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000451 """
452
Guido van Rossume888cdc2002-08-17 14:50:24 +0000453 if dir is None:
454 dir = gettempdir()
455
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000456 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000457
458 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
459 try:
460 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000461 return _io.open(fd, mode, buffering=buffering,
462 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000463 except:
464 _os.close(fd)
465 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000466
467class SpooledTemporaryFile:
468 """Temporary file wrapper, specialized to switch from
469 StringIO to a real file when it exceeds a certain size or
470 when a fileno is needed.
471 """
472 _rolled = False
473
Guido van Rossumf0c74162007-08-28 03:29:45 +0000474 def __init__(self, max_size=0, mode='w+b', buffering=-1,
475 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000476 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000477 if 'b' in mode:
478 self._file = _io.BytesIO()
479 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000480 # Setting newline="\n" avoids newline translation;
481 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000482 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000483 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000484 self._max_size = max_size
485 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000486 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
487 'suffix': suffix, 'prefix': prefix,
488 'encoding': encoding, 'newline': newline,
489 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000490
491 def _check(self, file):
492 if self._rolled: return
493 max_size = self._max_size
494 if max_size and file.tell() > max_size:
495 self.rollover()
496
497 def rollover(self):
498 if self._rolled: return
499 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000500 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000501 del self._TemporaryFileArgs
502
503 newfile.write(file.getvalue())
504 newfile.seek(file.tell(), 0)
505
506 self._rolled = True
507
Christian Heimes3ecfea712008-02-09 20:51:34 +0000508 # The method caching trick from NamedTemporaryFile
509 # won't work here, because _file may change from a
510 # _StringIO instance to a real file. So we list
511 # all the methods directly.
512
513 # Context management protocol
514 def __enter__(self):
515 if self._file.closed:
516 raise ValueError("Cannot enter context with closed file")
517 return self
518
519 def __exit__(self, exc, value, tb):
520 self._file.close()
521
Guido van Rossumd8faa362007-04-27 19:54:29 +0000522 # file protocol
523 def __iter__(self):
524 return self._file.__iter__()
525
526 def close(self):
527 self._file.close()
528
529 @property
530 def closed(self):
531 return self._file.closed
532
533 @property
534 def encoding(self):
535 return self._file.encoding
536
537 def fileno(self):
538 self.rollover()
539 return self._file.fileno()
540
541 def flush(self):
542 self._file.flush()
543
544 def isatty(self):
545 return self._file.isatty()
546
547 @property
548 def mode(self):
549 return self._file.mode
550
551 @property
552 def name(self):
553 return self._file.name
554
555 @property
556 def newlines(self):
557 return self._file.newlines
558
559 def next(self):
560 return self._file.next
561
562 def read(self, *args):
563 return self._file.read(*args)
564
565 def readline(self, *args):
566 return self._file.readline(*args)
567
568 def readlines(self, *args):
569 return self._file.readlines(*args)
570
571 def seek(self, *args):
572 self._file.seek(*args)
573
574 @property
575 def softspace(self):
576 return self._file.softspace
577
578 def tell(self):
579 return self._file.tell()
580
581 def truncate(self):
582 self._file.truncate()
583
584 def write(self, s):
585 file = self._file
586 rv = file.write(s)
587 self._check(file)
588 return rv
589
590 def writelines(self, iterable):
591 file = self._file
592 rv = file.writelines(iterable)
593 self._check(file)
594 return rv
595
596 def xreadlines(self, *args):
597 return self._file.xreadlines(*args)
Nick Coghlan543af752010-10-24 11:23:25 +0000598
599
600class TemporaryDirectory(object):
601 """Create and return a temporary directory. This has the same
602 behavior as mkdtemp but can be used as a context manager. For
603 example:
604
605 with TemporaryDirectory() as tmpdir:
606 ...
607
608 Upon exiting the context, the directory and everthing contained
609 in it are removed.
610 """
611
612 def __init__(self, suffix="", prefix=template, dir=None):
Nick Coghlan543af752010-10-24 11:23:25 +0000613 self._closed = False
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000614 self.name = None # Handle mkdtemp throwing an exception
615 self.name = mkdtemp(suffix, prefix, dir)
616
617 def __repr__(self):
618 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000619
620 def __enter__(self):
621 return self.name
622
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000623 def cleanup(self, _warn=False):
624 if self.name and not self._closed:
625 try:
626 self._rmtree(self.name)
627 except (TypeError, AttributeError) as ex:
628 # Issue #10188: Emit a warning on stderr
629 # if the directory could not be cleaned
630 # up due to missing globals
631 if "None" not in str(ex):
632 raise
633 print("ERROR: {!r} while cleaning up {!r}".format(ex, self,),
634 file=_sys.stderr)
635 return
Nick Coghlan543af752010-10-24 11:23:25 +0000636 self._closed = True
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000637 if _warn:
638 self._warn("Implicitly cleaning up {!r}".format(self),
639 ResourceWarning)
Nick Coghlan543af752010-10-24 11:23:25 +0000640
641 def __exit__(self, exc, value, tb):
642 self.cleanup()
643
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000644 def __del__(self):
645 # Issue a ResourceWarning if implicit cleanup needed
646 self.cleanup(_warn=True)
Nick Coghlan543af752010-10-24 11:23:25 +0000647
648 # XXX (ncoghlan): The following code attempts to make
649 # this class tolerant of the module nulling out process
650 # that happens during CPython interpreter shutdown
651 # Alas, it doesn't actually manage it. See issue #10188
652 _listdir = staticmethod(_os.listdir)
653 _path_join = staticmethod(_os.path.join)
654 _isdir = staticmethod(_os.path.isdir)
Charles-François Natalidef35432011-07-29 18:59:24 +0200655 _islink = staticmethod(_os.path.islink)
Nick Coghlan543af752010-10-24 11:23:25 +0000656 _remove = staticmethod(_os.remove)
657 _rmdir = staticmethod(_os.rmdir)
Florent Xicluna68f71a32011-10-28 16:06:23 +0200658 _os_error = OSError
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000659 _warn = _warnings.warn
Nick Coghlan543af752010-10-24 11:23:25 +0000660
661 def _rmtree(self, path):
662 # Essentially a stripped down version of shutil.rmtree. We can't
663 # use globals because they may be None'ed out at shutdown.
664 for name in self._listdir(path):
665 fullname = self._path_join(path, name)
666 try:
Charles-François Natalidef35432011-07-29 18:59:24 +0200667 isdir = self._isdir(fullname) and not self._islink(fullname)
Nick Coghlan543af752010-10-24 11:23:25 +0000668 except self._os_error:
669 isdir = False
670 if isdir:
671 self._rmtree(fullname)
672 else:
673 try:
674 self._remove(fullname)
675 except self._os_error:
676 pass
677 try:
678 self._rmdir(path)
679 except self._os_error:
680 pass