blob: 1eed23a499fe1fb49eb5643d2b83f7eb4f079e9b [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
Serhiy Storchaka7451a722013-02-09 22:25:49 +020034import errno as _errno
Guido van Rossum0e548712002-08-09 16:14:33 +000035from random import Random as _Random
36
Guido van Rossumd8faa362007-04-27 19:54:29 +000037try:
Georg Brandl2067bfd2008-05-25 13:05:15 +000038 import _thread
Brett Cannoncd171c82013-07-04 17:43:24 -040039except ImportError:
Georg Brandl2067bfd2008-05-25 13:05:15 +000040 import _dummy_thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000041_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000042
43_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000044if hasattr(_os, 'O_NOFOLLOW'):
45 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000046
47_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000048if hasattr(_os, 'O_BINARY'):
49 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000050
51if hasattr(_os, 'TMP_MAX'):
52 TMP_MAX = _os.TMP_MAX
53else:
54 TMP_MAX = 10000
55
R David Murray3a420c72011-06-22 21:01:13 -040056# Although it does not have an underscore for historical reasons, this
57# variable is an internal implementation detail (see issue 10354).
Tim Petersbd7b4c72002-08-13 23:33:56 +000058template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000059
Guido van Rossum0e548712002-08-09 16:14:33 +000060# Internal routines.
61
62_once_lock = _allocate_lock()
63
Guido van Rossumb256159392003-11-10 02:16:36 +000064if hasattr(_os, "lstat"):
65 _stat = _os.lstat
66elif hasattr(_os, "stat"):
67 _stat = _os.stat
68else:
Florent Xicluna68f71a32011-10-28 16:06:23 +020069 # Fallback. All we need is something that raises OSError if the
Guido van Rossumb256159392003-11-10 02:16:36 +000070 # file doesn't exist.
71 def _stat(fn):
Victor Stinnerdaf45552013-08-28 00:53:59 +020072 fd = _os.open(fn, _os.O_RDONLY)
73 os.close(fd)
Guido van Rossumb256159392003-11-10 02:16:36 +000074
75def _exists(fn):
76 try:
77 _stat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020078 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +000079 return False
80 else:
81 return True
82
Guido van Rossum0e548712002-08-09 16:14:33 +000083class _RandomNameSequence:
84 """An instance of _RandomNameSequence generates an endless
85 sequence of unpredictable strings which can safely be incorporated
86 into file names. Each string is six characters long. Multiple
87 threads can safely use the same instance at the same time.
88
89 _RandomNameSequence is an iterator."""
90
Raymond Hettinger572895b2010-11-09 03:43:58 +000091 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Guido van Rossum0e548712002-08-09 16:14:33 +000092
Antoine Pitrou4558bad2011-11-25 21:28:15 +010093 @property
94 def rng(self):
95 cur_pid = _os.getpid()
96 if cur_pid != getattr(self, '_rng_pid', None):
97 self._rng = _Random()
98 self._rng_pid = cur_pid
99 return self._rng
Tim Peters97701b52002-11-21 15:59:59 +0000100
Guido van Rossum0e548712002-08-09 16:14:33 +0000101 def __iter__(self):
102 return self
103
Georg Brandla18af4e2007-04-21 15:47:16 +0000104 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000105 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000106 choose = self.rng.choice
Victor Stinner97869102013-08-14 01:28:28 +0200107 letters = [choose(c) for dummy in range(8)]
Raymond Hettinger572895b2010-11-09 03:43:58 +0000108 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000109
110def _candidate_tempdir_list():
111 """Generate a list of candidate temporary directories which
112 _get_default_tempdir will try."""
113
114 dirlist = []
115
116 # First, try the environment.
117 for envname in 'TMPDIR', 'TEMP', 'TMP':
118 dirname = _os.getenv(envname)
119 if dirname: dirlist.append(dirname)
120
121 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000122 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000123 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
124 else:
125 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
126
127 # As a last resort, the current directory.
128 try:
129 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200130 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000131 dirlist.append(_os.curdir)
132
133 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000134
Guido van Rossum0e548712002-08-09 16:14:33 +0000135def _get_default_tempdir():
136 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000137 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000138
139 We determine whether or not a candidate temp dir is usable by
140 trying to create and write to a file in that directory. If this
141 is successful, the test file is deleted. To prevent denial of
142 service, the name of the test file must be randomized."""
143
144 namer = _RandomNameSequence()
145 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000146
147 for dir in dirlist:
148 if dir != _os.curdir:
149 dir = _os.path.normcase(_os.path.abspath(dir))
150 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000151 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000152 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000153 filename = _os.path.join(dir, name)
154 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000155 fd = _os.open(filename, _bin_openflags, 0o600)
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200156 try:
157 try:
Serhiy Storchaka76a2ed12013-02-13 00:59:26 +0200158 with _io.open(fd, 'wb', closefd=False) as fp:
159 fp.write(b'blat')
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200160 finally:
161 _os.close(fd)
162 finally:
163 _os.unlink(filename)
Guido van Rossum0e548712002-08-09 16:14:33 +0000164 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200165 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000166 pass
Florent Xicluna68f71a32011-10-28 16:06:23 +0200167 except OSError:
168 break # no point trying more names in this directory
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200169 raise FileNotFoundError(_errno.ENOENT,
170 "No usable temporary directory found in %s" %
171 dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000172
Guido van Rossume888cdc2002-08-17 14:50:24 +0000173_name_sequence = None
174
Guido van Rossum0e548712002-08-09 16:14:33 +0000175def _get_candidate_names():
176 """Common setup sequence for all user-callable interfaces."""
177
Guido van Rossume888cdc2002-08-17 14:50:24 +0000178 global _name_sequence
179 if _name_sequence is None:
180 _once_lock.acquire()
181 try:
182 if _name_sequence is None:
183 _name_sequence = _RandomNameSequence()
184 finally:
185 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000186 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000187
188
Guido van Rossum0e548712002-08-09 16:14:33 +0000189def _mkstemp_inner(dir, pre, suf, flags):
190 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000191
Guido van Rossum0e548712002-08-09 16:14:33 +0000192 names = _get_candidate_names()
193
Guido van Rossum805365e2007-05-07 22:24:25 +0000194 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000195 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000196 file = _os.path.join(dir, pre + name + suf)
197 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000198 fd = _os.open(file, flags, 0o600)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000199 return (fd, _os.path.abspath(file))
Florent Xicluna68f71a32011-10-28 16:06:23 +0200200 except FileExistsError:
201 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000202
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200203 raise FileExistsError(_errno.EEXIST,
204 "No usable temporary file name found")
Tim Petersa0d55de2002-08-09 18:01:01 +0000205
Guido van Rossum0e548712002-08-09 16:14:33 +0000206
207# User visible interfaces.
Guido van Rossumb0e57181998-10-14 20:27:05 +0000208
Guido van Rossum41f95031992-03-31 19:02:01 +0000209def gettempprefix():
Guido van Rossum0e548712002-08-09 16:14:33 +0000210 """Accessor for tempdir.template."""
211 return template
Tim Peters9fadfb02001-01-13 03:04:02 +0000212
Guido van Rossume888cdc2002-08-17 14:50:24 +0000213tempdir = None
214
Guido van Rossum0e548712002-08-09 16:14:33 +0000215def gettempdir():
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000216 """Accessor for tempfile.tempdir."""
Guido van Rossume888cdc2002-08-17 14:50:24 +0000217 global tempdir
218 if tempdir is None:
219 _once_lock.acquire()
220 try:
221 if tempdir is None:
222 tempdir = _get_default_tempdir()
223 finally:
224 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000225 return tempdir
226
Guido van Rossume888cdc2002-08-17 14:50:24 +0000227def mkstemp(suffix="", prefix=template, dir=None, text=False):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000228 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000229 file. The return value is a pair (fd, name) where fd is the
230 file descriptor returned by os.open, and name is the filename.
231
232 If 'suffix' is specified, the file name will end with that suffix,
233 otherwise there will be no suffix.
234
235 If 'prefix' is specified, the file name will begin with that prefix,
236 otherwise a default prefix is used.
237
238 If 'dir' is specified, the file will be created in that directory,
239 otherwise a default directory is used.
240
Tim Peters04490bf2002-08-14 15:41:26 +0000241 If 'text' is specified and true, the file is opened in text
242 mode. Else (the default) the file is opened in binary mode. On
243 some operating systems, this makes no difference.
Guido van Rossum0e548712002-08-09 16:14:33 +0000244
245 The file is readable and writable only by the creating user ID.
246 If the operating system uses permission bits to indicate whether a
247 file is executable, the file is executable by no one. The file
248 descriptor is not inherited by children of this process.
249
250 Caller is responsible for deleting the file when done with it.
Tim Peters9fadfb02001-01-13 03:04:02 +0000251 """
252
Guido van Rossume888cdc2002-08-17 14:50:24 +0000253 if dir is None:
254 dir = gettempdir()
255
Tim Peters04490bf2002-08-14 15:41:26 +0000256 if text:
Guido van Rossum0e548712002-08-09 16:14:33 +0000257 flags = _text_openflags
Tim Peters04490bf2002-08-14 15:41:26 +0000258 else:
259 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000260
261 return _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumcff34541992-01-14 18:31:56 +0000262
Guido van Rossumeee94981991-11-12 15:38:08 +0000263
Guido van Rossume888cdc2002-08-17 14:50:24 +0000264def mkdtemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000265 """User-callable function to create and return a unique temporary
Guido van Rossum0e548712002-08-09 16:14:33 +0000266 directory. The return value is the pathname of the directory.
267
Tim Peters04490bf2002-08-14 15:41:26 +0000268 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000269 not accepted.
270
271 The directory is readable, writable, and searchable only by the
272 creating user.
273
274 Caller is responsible for deleting the directory when done with it.
275 """
276
Guido van Rossume888cdc2002-08-17 14:50:24 +0000277 if dir is None:
278 dir = gettempdir()
279
Guido van Rossum0e548712002-08-09 16:14:33 +0000280 names = _get_candidate_names()
Tim Petersa0d55de2002-08-09 18:01:01 +0000281
Guido van Rossum805365e2007-05-07 22:24:25 +0000282 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000283 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000284 file = _os.path.join(dir, prefix + name + suffix)
285 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000286 _os.mkdir(file, 0o700)
Guido van Rossum0e548712002-08-09 16:14:33 +0000287 return file
Florent Xicluna68f71a32011-10-28 16:06:23 +0200288 except FileExistsError:
289 continue # try again
Guido van Rossum0e548712002-08-09 16:14:33 +0000290
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200291 raise FileExistsError(_errno.EEXIST,
292 "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000293
Guido van Rossume888cdc2002-08-17 14:50:24 +0000294def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000295 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000296 file is not created.
297
Tim Peters04490bf2002-08-14 15:41:26 +0000298 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000299 not accepted.
300
301 This function is unsafe and should not be used. The file name
302 refers to a file that did not exist at some point, but by the time
303 you get around to creating it, someone else may have beaten you to
304 the punch.
305 """
306
Guido van Rossum44f602d2002-11-22 15:56:29 +0000307## from warnings import warn as _warn
308## _warn("mktemp is a potential security risk to your program",
309## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000310
Guido van Rossume888cdc2002-08-17 14:50:24 +0000311 if dir is None:
312 dir = gettempdir()
313
Guido van Rossum0e548712002-08-09 16:14:33 +0000314 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000315 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000316 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000317 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000318 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000319 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000320
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200321 raise FileExistsError(_errno.EEXIST,
322 "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000323
Christian Heimes3ecfea712008-02-09 20:51:34 +0000324
Guido van Rossum0e548712002-08-09 16:14:33 +0000325class _TemporaryFileWrapper:
Guido van Rossumca549821997-08-12 18:00:12 +0000326 """Temporary file wrapper
327
Guido van Rossum0e548712002-08-09 16:14:33 +0000328 This class provides a wrapper around files opened for
329 temporary use. In particular, it seeks to automatically
330 remove the file when it is no longer needed.
Guido van Rossumca549821997-08-12 18:00:12 +0000331 """
Tim Petersa255a722001-12-18 22:32:40 +0000332
Guido van Rossumd8faa362007-04-27 19:54:29 +0000333 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000334 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000335 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000336 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000337 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000338
Guido van Rossumca549821997-08-12 18:00:12 +0000339 def __getattr__(self, name):
Christian Heimes3ecfea712008-02-09 20:51:34 +0000340 # Attribute lookups are delegated to the underlying file
341 # and cached for non-numeric results
342 # (i.e. methods are cached, closed and friends are not)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000343 file = self.__dict__['file']
344 a = getattr(file, name)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000345 if not isinstance(a, int):
Guido van Rossum6b708d51999-06-01 18:55:36 +0000346 setattr(self, name, a)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000347 return a
Guido van Rossumca549821997-08-12 18:00:12 +0000348
Christian Heimes3ecfea712008-02-09 20:51:34 +0000349 # The underlying __enter__ method returns the wrong object
350 # (self.file) so override it to return the wrapper
351 def __enter__(self):
352 self.file.__enter__()
353 return self
354
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000355 # iter() doesn't use __getattr__ to find the __iter__ method
Christian Heimesc83b6292008-02-28 21:10:17 +0000356 def __iter__(self):
Christian Heimes36d1f8e2008-02-28 22:21:11 +0000357 return iter(self.file)
Christian Heimesc83b6292008-02-28 21:10:17 +0000358
Guido van Rossum0e548712002-08-09 16:14:33 +0000359 # NT provides delete-on-close as a primitive, so we don't need
360 # the wrapper to do anything special. We still use it so that
361 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
362 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000363 # Cache the unlinker so we don't get spurious errors at
364 # shutdown when the module-level "os" is None'd out. Note
365 # that this must be referenced as self.unlink, because the
366 # name TemporaryFileWrapper may also get None'd out before
367 # __del__ is called.
368 unlink = _os.unlink
Tim Peters1baa22af2001-01-12 10:02:46 +0000369
Guido van Rossum0e548712002-08-09 16:14:33 +0000370 def close(self):
371 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000372 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000373 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000374 if self.delete:
375 self.unlink(self.name)
Tim Peters1baa22af2001-01-12 10:02:46 +0000376
Guido van Rossum0e548712002-08-09 16:14:33 +0000377 def __del__(self):
378 self.close()
Tim Peters1baa22af2001-01-12 10:02:46 +0000379
Christian Heimes3ecfea712008-02-09 20:51:34 +0000380 # Need to trap __exit__ as well to ensure the file gets
381 # deleted when used in a with statement
382 def __exit__(self, exc, value, tb):
383 result = self.file.__exit__(exc, value, tb)
384 self.close()
385 return result
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000386 else:
387 def __exit__(self, exc, value, tb):
Benjamin Peterson3f5de132009-07-01 15:47:07 +0000388 self.file.__exit__(exc, value, tb)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000389
390
Guido van Rossumf0c74162007-08-28 03:29:45 +0000391def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
392 newline=None, suffix="", prefix=template,
393 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000394 """Create and return a temporary file.
395 Arguments:
396 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000397 'mode' -- the mode argument to io.open (default "w+b").
398 'buffering' -- the buffer size argument to io.open (default -1).
399 'encoding' -- the encoding argument to io.open (default None)
400 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000401 'delete' -- whether the file is deleted on close (default True).
Guido van Rossum0e548712002-08-09 16:14:33 +0000402 The file is created as mkstemp() would do it.
Tim Peters1baa22af2001-01-12 10:02:46 +0000403
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000404 Returns an object with a file-like interface; the name of the file
405 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000406 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000407 """
Tim Peters1baa22af2001-01-12 10:02:46 +0000408
Guido van Rossume888cdc2002-08-17 14:50:24 +0000409 if dir is None:
410 dir = gettempdir()
411
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000412 flags = _bin_openflags
Tim Peters1baa22af2001-01-12 10:02:46 +0000413
Guido van Rossum0e548712002-08-09 16:14:33 +0000414 # Setting O_TEMPORARY in the flags causes the OS to delete
415 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000416 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000417 flags |= _os.O_TEMPORARY
Tim Peters1baa22af2001-01-12 10:02:46 +0000418
Guido van Rossum0e548712002-08-09 16:14:33 +0000419 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000420 file = _io.open(fd, mode, buffering=buffering,
421 newline=newline, encoding=encoding)
422
Guido van Rossumd8faa362007-04-27 19:54:29 +0000423 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000424
Jason Tishler80c02af2002-08-14 15:10:09 +0000425if _os.name != 'posix' or _os.sys.platform == 'cygwin':
426 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
427 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000428 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22af2001-01-12 10:02:46 +0000429
430else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000431 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
432 newline=None, suffix="", prefix=template,
433 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000434 """Create and return a temporary file.
435 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000436 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000437 'mode' -- the mode argument to io.open (default "w+b").
438 'buffering' -- the buffer size argument to io.open (default -1).
439 'encoding' -- the encoding argument to io.open (default None)
440 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000441 The file is created as mkstemp() would do it.
Tim Peters1baa22af2001-01-12 10:02:46 +0000442
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000443 Returns an object with a file-like interface. The file has no
444 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000445 """
446
Guido van Rossume888cdc2002-08-17 14:50:24 +0000447 if dir is None:
448 dir = gettempdir()
449
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000450 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000451
452 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
453 try:
454 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000455 return _io.open(fd, mode, buffering=buffering,
456 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000457 except:
458 _os.close(fd)
459 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000460
461class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200462 """Temporary file wrapper, specialized to switch from BytesIO
463 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000464 when a fileno is needed.
465 """
466 _rolled = False
467
Guido van Rossumf0c74162007-08-28 03:29:45 +0000468 def __init__(self, max_size=0, mode='w+b', buffering=-1,
469 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000470 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000471 if 'b' in mode:
472 self._file = _io.BytesIO()
473 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000474 # Setting newline="\n" avoids newline translation;
475 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000476 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000477 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000478 self._max_size = max_size
479 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000480 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
481 'suffix': suffix, 'prefix': prefix,
482 'encoding': encoding, 'newline': newline,
483 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000484
485 def _check(self, file):
486 if self._rolled: return
487 max_size = self._max_size
488 if max_size and file.tell() > max_size:
489 self.rollover()
490
491 def rollover(self):
492 if self._rolled: return
493 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000494 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000495 del self._TemporaryFileArgs
496
497 newfile.write(file.getvalue())
498 newfile.seek(file.tell(), 0)
499
500 self._rolled = True
501
Christian Heimes3ecfea712008-02-09 20:51:34 +0000502 # The method caching trick from NamedTemporaryFile
503 # won't work here, because _file may change from a
Serhiy Storchaka50254c52013-08-29 11:35:43 +0300504 # BytesIO/StringIO instance to a real file. So we list
Christian Heimes3ecfea712008-02-09 20:51:34 +0000505 # all the methods directly.
506
507 # Context management protocol
508 def __enter__(self):
509 if self._file.closed:
510 raise ValueError("Cannot enter context with closed file")
511 return self
512
513 def __exit__(self, exc, value, tb):
514 self._file.close()
515
Guido van Rossumd8faa362007-04-27 19:54:29 +0000516 # file protocol
517 def __iter__(self):
518 return self._file.__iter__()
519
520 def close(self):
521 self._file.close()
522
523 @property
524 def closed(self):
525 return self._file.closed
526
527 @property
528 def encoding(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200529 try:
530 return self._file.encoding
531 except AttributeError:
532 if 'b' in self._TemporaryFileArgs['mode']:
533 raise
534 return self._TemporaryFileArgs['encoding']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000535
536 def fileno(self):
537 self.rollover()
538 return self._file.fileno()
539
540 def flush(self):
541 self._file.flush()
542
543 def isatty(self):
544 return self._file.isatty()
545
546 @property
547 def mode(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200548 try:
549 return self._file.mode
550 except AttributeError:
551 return self._TemporaryFileArgs['mode']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000552
553 @property
554 def name(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200555 try:
556 return self._file.name
557 except AttributeError:
558 return None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000559
560 @property
561 def newlines(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200562 try:
563 return self._file.newlines
564 except AttributeError:
565 if 'b' in self._TemporaryFileArgs['mode']:
566 raise
567 return self._TemporaryFileArgs['newline']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000568
569 def read(self, *args):
570 return self._file.read(*args)
571
572 def readline(self, *args):
573 return self._file.readline(*args)
574
575 def readlines(self, *args):
576 return self._file.readlines(*args)
577
578 def seek(self, *args):
579 self._file.seek(*args)
580
581 @property
582 def softspace(self):
583 return self._file.softspace
584
585 def tell(self):
586 return self._file.tell()
587
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100588 def truncate(self, size=None):
589 if size is None:
590 self._file.truncate()
591 else:
592 if size > self._max_size:
593 self.rollover()
594 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000595
596 def write(self, s):
597 file = self._file
598 rv = file.write(s)
599 self._check(file)
600 return rv
601
602 def writelines(self, iterable):
603 file = self._file
604 rv = file.writelines(iterable)
605 self._check(file)
606 return rv
607
Nick Coghlan543af752010-10-24 11:23:25 +0000608
609class TemporaryDirectory(object):
610 """Create and return a temporary directory. This has the same
611 behavior as mkdtemp but can be used as a context manager. For
612 example:
613
614 with TemporaryDirectory() as tmpdir:
615 ...
616
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300617 Upon exiting the context, the directory and everything contained
Nick Coghlan543af752010-10-24 11:23:25 +0000618 in it are removed.
619 """
620
621 def __init__(self, suffix="", prefix=template, dir=None):
Nick Coghlan543af752010-10-24 11:23:25 +0000622 self._closed = False
Andrew Svetlov737fb892012-12-18 21:14:22 +0200623 self.name = None # Handle mkdtemp raising an exception
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000624 self.name = mkdtemp(suffix, prefix, dir)
625
626 def __repr__(self):
627 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000628
629 def __enter__(self):
630 return self.name
631
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000632 def cleanup(self, _warn=False):
633 if self.name and not self._closed:
634 try:
635 self._rmtree(self.name)
636 except (TypeError, AttributeError) as ex:
637 # Issue #10188: Emit a warning on stderr
638 # if the directory could not be cleaned
639 # up due to missing globals
640 if "None" not in str(ex):
641 raise
642 print("ERROR: {!r} while cleaning up {!r}".format(ex, self,),
643 file=_sys.stderr)
644 return
Nick Coghlan543af752010-10-24 11:23:25 +0000645 self._closed = True
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000646 if _warn:
647 self._warn("Implicitly cleaning up {!r}".format(self),
648 ResourceWarning)
Nick Coghlan543af752010-10-24 11:23:25 +0000649
650 def __exit__(self, exc, value, tb):
651 self.cleanup()
652
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000653 def __del__(self):
654 # Issue a ResourceWarning if implicit cleanup needed
655 self.cleanup(_warn=True)
Nick Coghlan543af752010-10-24 11:23:25 +0000656
657 # XXX (ncoghlan): The following code attempts to make
658 # this class tolerant of the module nulling out process
659 # that happens during CPython interpreter shutdown
660 # Alas, it doesn't actually manage it. See issue #10188
661 _listdir = staticmethod(_os.listdir)
662 _path_join = staticmethod(_os.path.join)
663 _isdir = staticmethod(_os.path.isdir)
Charles-François Natalidef35432011-07-29 18:59:24 +0200664 _islink = staticmethod(_os.path.islink)
Nick Coghlan543af752010-10-24 11:23:25 +0000665 _remove = staticmethod(_os.remove)
666 _rmdir = staticmethod(_os.rmdir)
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000667 _warn = _warnings.warn
Nick Coghlan543af752010-10-24 11:23:25 +0000668
669 def _rmtree(self, path):
670 # Essentially a stripped down version of shutil.rmtree. We can't
671 # use globals because they may be None'ed out at shutdown.
672 for name in self._listdir(path):
673 fullname = self._path_join(path, name)
674 try:
Charles-François Natalidef35432011-07-29 18:59:24 +0200675 isdir = self._isdir(fullname) and not self._islink(fullname)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200676 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000677 isdir = False
678 if isdir:
679 self._rmtree(fullname)
680 else:
681 try:
682 self._remove(fullname)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200683 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000684 pass
685 try:
686 self._rmdir(path)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200687 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000688 pass