blob: eae528da836b0b239bbf532bd7e08d0f53dd6c5a [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
Antoine Pitrou17c93262013-12-21 22:14:56 +010030import functools as _functools
Nick Coghlan6b22f3f2010-12-12 15:24:21 +000031import warnings as _warnings
32import sys as _sys
Guido van Rossum9a634702007-07-09 10:24:45 +000033import io as _io
Guido van Rossum0e548712002-08-09 16:14:33 +000034import os as _os
Serhiy Storchaka7451a722013-02-09 22:25:49 +020035import errno as _errno
Guido van Rossum0e548712002-08-09 16:14:33 +000036from random import Random as _Random
37
Guido van Rossumd8faa362007-04-27 19:54:29 +000038try:
Georg Brandl2067bfd2008-05-25 13:05:15 +000039 import _thread
Brett Cannoncd171c82013-07-04 17:43:24 -040040except ImportError:
Georg Brandl2067bfd2008-05-25 13:05:15 +000041 import _dummy_thread as _thread
Guido van Rossuma0934242002-12-30 22:36:09 +000042_allocate_lock = _thread.allocate_lock
Guido van Rossum0e548712002-08-09 16:14:33 +000043
44_text_openflags = _os.O_RDWR | _os.O_CREAT | _os.O_EXCL
Tim Petersa0d55de2002-08-09 18:01:01 +000045if hasattr(_os, 'O_NOFOLLOW'):
46 _text_openflags |= _os.O_NOFOLLOW
Guido van Rossum0e548712002-08-09 16:14:33 +000047
48_bin_openflags = _text_openflags
Tim Petersa0d55de2002-08-09 18:01:01 +000049if hasattr(_os, 'O_BINARY'):
50 _bin_openflags |= _os.O_BINARY
Guido van Rossum0e548712002-08-09 16:14:33 +000051
52if hasattr(_os, 'TMP_MAX'):
53 TMP_MAX = _os.TMP_MAX
54else:
55 TMP_MAX = 10000
56
R David Murray3a420c72011-06-22 21:01:13 -040057# Although it does not have an underscore for historical reasons, this
58# variable is an internal implementation detail (see issue 10354).
Tim Petersbd7b4c72002-08-13 23:33:56 +000059template = "tmp"
Guido van Rossum0e548712002-08-09 16:14:33 +000060
Guido van Rossum0e548712002-08-09 16:14:33 +000061# Internal routines.
62
63_once_lock = _allocate_lock()
64
Guido van Rossumb256159392003-11-10 02:16:36 +000065if hasattr(_os, "lstat"):
66 _stat = _os.lstat
67elif hasattr(_os, "stat"):
68 _stat = _os.stat
69else:
Florent Xicluna68f71a32011-10-28 16:06:23 +020070 # Fallback. All we need is something that raises OSError if the
Guido van Rossumb256159392003-11-10 02:16:36 +000071 # file doesn't exist.
72 def _stat(fn):
Victor Stinnerdaf45552013-08-28 00:53:59 +020073 fd = _os.open(fn, _os.O_RDONLY)
74 os.close(fd)
Guido van Rossumb256159392003-11-10 02:16:36 +000075
76def _exists(fn):
77 try:
78 _stat(fn)
Florent Xicluna68f71a32011-10-28 16:06:23 +020079 except OSError:
Guido van Rossumb256159392003-11-10 02:16:36 +000080 return False
81 else:
82 return True
83
Guido van Rossum0e548712002-08-09 16:14:33 +000084class _RandomNameSequence:
85 """An instance of _RandomNameSequence generates an endless
86 sequence of unpredictable strings which can safely be incorporated
87 into file names. Each string is six characters long. Multiple
88 threads can safely use the same instance at the same time.
89
90 _RandomNameSequence is an iterator."""
91
Raymond Hettinger572895b2010-11-09 03:43:58 +000092 characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
Guido van Rossum0e548712002-08-09 16:14:33 +000093
Antoine Pitrou4558bad2011-11-25 21:28:15 +010094 @property
95 def rng(self):
96 cur_pid = _os.getpid()
97 if cur_pid != getattr(self, '_rng_pid', None):
98 self._rng = _Random()
99 self._rng_pid = cur_pid
100 return self._rng
Tim Peters97701b52002-11-21 15:59:59 +0000101
Guido van Rossum0e548712002-08-09 16:14:33 +0000102 def __iter__(self):
103 return self
104
Georg Brandla18af4e2007-04-21 15:47:16 +0000105 def __next__(self):
Guido van Rossum0e548712002-08-09 16:14:33 +0000106 c = self.characters
Tim Peters97701b52002-11-21 15:59:59 +0000107 choose = self.rng.choice
Victor Stinner97869102013-08-14 01:28:28 +0200108 letters = [choose(c) for dummy in range(8)]
Raymond Hettinger572895b2010-11-09 03:43:58 +0000109 return ''.join(letters)
Guido van Rossum0e548712002-08-09 16:14:33 +0000110
111def _candidate_tempdir_list():
112 """Generate a list of candidate temporary directories which
113 _get_default_tempdir will try."""
114
115 dirlist = []
116
117 # First, try the environment.
118 for envname in 'TMPDIR', 'TEMP', 'TMP':
119 dirname = _os.getenv(envname)
120 if dirname: dirlist.append(dirname)
121
122 # Failing that, try OS-specific locations.
Alexandre Vassalottieca20b62008-05-16 02:54:33 +0000123 if _os.name == 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000124 dirlist.extend([ r'c:\temp', r'c:\tmp', r'\temp', r'\tmp' ])
125 else:
126 dirlist.extend([ '/tmp', '/var/tmp', '/usr/tmp' ])
127
128 # As a last resort, the current directory.
129 try:
130 dirlist.append(_os.getcwd())
Florent Xicluna68f71a32011-10-28 16:06:23 +0200131 except (AttributeError, OSError):
Guido van Rossum0e548712002-08-09 16:14:33 +0000132 dirlist.append(_os.curdir)
133
134 return dirlist
Tim Petersa0d55de2002-08-09 18:01:01 +0000135
Guido van Rossum0e548712002-08-09 16:14:33 +0000136def _get_default_tempdir():
137 """Calculate the default directory to use for temporary files.
Guido van Rossume888cdc2002-08-17 14:50:24 +0000138 This routine should be called exactly once.
Guido van Rossum0e548712002-08-09 16:14:33 +0000139
140 We determine whether or not a candidate temp dir is usable by
141 trying to create and write to a file in that directory. If this
142 is successful, the test file is deleted. To prevent denial of
143 service, the name of the test file must be randomized."""
144
145 namer = _RandomNameSequence()
146 dirlist = _candidate_tempdir_list()
Guido van Rossum0e548712002-08-09 16:14:33 +0000147
148 for dir in dirlist:
149 if dir != _os.curdir:
Tim Golden6d09f092013-10-25 18:38:16 +0100150 dir = _os.path.abspath(dir)
Guido van Rossum0e548712002-08-09 16:14:33 +0000151 # Try only a few names per directory.
Guido van Rossum805365e2007-05-07 22:24:25 +0000152 for seq in range(100):
Georg Brandla18af4e2007-04-21 15:47:16 +0000153 name = next(namer)
Guido van Rossum0e548712002-08-09 16:14:33 +0000154 filename = _os.path.join(dir, name)
155 try:
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000156 fd = _os.open(filename, _bin_openflags, 0o600)
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200157 try:
158 try:
Serhiy Storchaka76a2ed12013-02-13 00:59:26 +0200159 with _io.open(fd, 'wb', closefd=False) as fp:
160 fp.write(b'blat')
Serhiy Storchakaf6b361e2013-02-13 00:35:30 +0200161 finally:
162 _os.close(fd)
163 finally:
164 _os.unlink(filename)
Guido van Rossum0e548712002-08-09 16:14:33 +0000165 return dir
Florent Xicluna68f71a32011-10-28 16:06:23 +0200166 except FileExistsError:
Guido van Rossum0e548712002-08-09 16:14:33 +0000167 pass
Florent Xicluna68f71a32011-10-28 16:06:23 +0200168 except OSError:
169 break # no point trying more names in this directory
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200170 raise FileNotFoundError(_errno.ENOENT,
171 "No usable temporary directory found in %s" %
172 dirlist)
Guido van Rossum0e548712002-08-09 16:14:33 +0000173
Guido van Rossume888cdc2002-08-17 14:50:24 +0000174_name_sequence = None
175
Guido van Rossum0e548712002-08-09 16:14:33 +0000176def _get_candidate_names():
177 """Common setup sequence for all user-callable interfaces."""
178
Guido van Rossume888cdc2002-08-17 14:50:24 +0000179 global _name_sequence
180 if _name_sequence is None:
181 _once_lock.acquire()
182 try:
183 if _name_sequence is None:
184 _name_sequence = _RandomNameSequence()
185 finally:
186 _once_lock.release()
Guido van Rossum0e548712002-08-09 16:14:33 +0000187 return _name_sequence
Guido van Rossum41f95031992-03-31 19:02:01 +0000188
189
Guido van Rossum0e548712002-08-09 16:14:33 +0000190def _mkstemp_inner(dir, pre, suf, flags):
191 """Code common to mkstemp, TemporaryFile, and NamedTemporaryFile."""
Tim Peters9fadfb02001-01-13 03:04:02 +0000192
Guido van Rossum0e548712002-08-09 16:14:33 +0000193 names = _get_candidate_names()
194
Guido van Rossum805365e2007-05-07 22:24:25 +0000195 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000196 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000197 file = _os.path.join(dir, pre + name + suf)
198 try:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000199 fd = _os.open(file, flags, 0o600)
Martin v. Löwisd6625482003-10-12 17:37:01 +0000200 return (fd, _os.path.abspath(file))
Florent Xicluna68f71a32011-10-28 16:06:23 +0200201 except FileExistsError:
202 continue # try again
Eli Benderskyf315df32013-09-06 06:11:19 -0700203 except PermissionError:
204 # This exception is thrown when a directory with the chosen name
205 # already exists on windows.
206 if _os.name == 'nt':
207 continue
208 else:
209 raise
Guido van Rossum0e548712002-08-09 16:14:33 +0000210
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200211 raise FileExistsError(_errno.EEXIST,
212 "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
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200299 raise FileExistsError(_errno.EEXIST,
300 "No usable temporary directory name found")
Guido van Rossum0e548712002-08-09 16:14:33 +0000301
Guido van Rossume888cdc2002-08-17 14:50:24 +0000302def mktemp(suffix="", prefix=template, dir=None):
Christian Heimes81ee3ef2008-05-04 22:42:01 +0000303 """User-callable function to return a unique temporary file name. The
Guido van Rossum0e548712002-08-09 16:14:33 +0000304 file is not created.
305
Tim Peters04490bf2002-08-14 15:41:26 +0000306 Arguments are as for mkstemp, except that the 'text' argument is
Guido van Rossum0e548712002-08-09 16:14:33 +0000307 not accepted.
308
309 This function is unsafe and should not be used. The file name
310 refers to a file that did not exist at some point, but by the time
311 you get around to creating it, someone else may have beaten you to
312 the punch.
313 """
314
Guido van Rossum44f602d2002-11-22 15:56:29 +0000315## from warnings import warn as _warn
316## _warn("mktemp is a potential security risk to your program",
317## RuntimeWarning, stacklevel=2)
Guido van Rossum0e548712002-08-09 16:14:33 +0000318
Guido van Rossume888cdc2002-08-17 14:50:24 +0000319 if dir is None:
320 dir = gettempdir()
321
Guido van Rossum0e548712002-08-09 16:14:33 +0000322 names = _get_candidate_names()
Guido van Rossum805365e2007-05-07 22:24:25 +0000323 for seq in range(TMP_MAX):
Georg Brandla18af4e2007-04-21 15:47:16 +0000324 name = next(names)
Guido van Rossum0e548712002-08-09 16:14:33 +0000325 file = _os.path.join(dir, prefix + name + suffix)
Guido van Rossumb256159392003-11-10 02:16:36 +0000326 if not _exists(file):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000327 return file
Guido van Rossumca549821997-08-12 18:00:12 +0000328
Serhiy Storchaka7451a722013-02-09 22:25:49 +0200329 raise FileExistsError(_errno.EEXIST,
330 "No usable temporary filename found")
Guido van Rossumca549821997-08-12 18:00:12 +0000331
Christian Heimes3ecfea712008-02-09 20:51:34 +0000332
Antoine Pitrou17c93262013-12-21 22:14:56 +0100333class _TemporaryFileCloser:
334 """A separate object allowing proper closing of a temporary file's
335 underlying file object, without adding a __del__ method to the
336 temporary file."""
Tim Petersa255a722001-12-18 22:32:40 +0000337
Guido van Rossumd8faa362007-04-27 19:54:29 +0000338 def __init__(self, file, name, delete=True):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000339 self.file = file
Guido van Rossum0e548712002-08-09 16:14:33 +0000340 self.name = name
Tim Peters6ef966e2002-11-21 15:48:33 +0000341 self.close_called = False
Guido van Rossumd8faa362007-04-27 19:54:29 +0000342 self.delete = delete
Guido van Rossumca549821997-08-12 18:00:12 +0000343
Guido van Rossum0e548712002-08-09 16:14:33 +0000344 # NT provides delete-on-close as a primitive, so we don't need
345 # the wrapper to do anything special. We still use it so that
346 # file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
347 if _os.name != 'nt':
Guido van Rossum0e548712002-08-09 16:14:33 +0000348 # Cache the unlinker so we don't get spurious errors at
349 # shutdown when the module-level "os" is None'd out. Note
350 # that this must be referenced as self.unlink, because the
351 # name TemporaryFileWrapper may also get None'd out before
352 # __del__ is called.
353 unlink = _os.unlink
Tim Peters1baa22af2001-01-12 10:02:46 +0000354
Guido van Rossum0e548712002-08-09 16:14:33 +0000355 def close(self):
356 if not self.close_called:
Tim Peters6ef966e2002-11-21 15:48:33 +0000357 self.close_called = True
Guido van Rossum0e548712002-08-09 16:14:33 +0000358 self.file.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000359 if self.delete:
360 self.unlink(self.name)
Tim Peters1baa22af2001-01-12 10:02:46 +0000361
Antoine Pitrou17c93262013-12-21 22:14:56 +0100362 # Need to ensure the file is deleted on __del__
Guido van Rossum0e548712002-08-09 16:14:33 +0000363 def __del__(self):
364 self.close()
Tim Peters1baa22af2001-01-12 10:02:46 +0000365
Benjamin Peterson98d23f22009-06-30 22:27:25 +0000366 else:
Antoine Pitrou17c93262013-12-21 22:14:56 +0100367 def close(self):
368 if not self.close_called:
369 self.close_called = True
370 self.file.close()
371
372
373class _TemporaryFileWrapper:
374 """Temporary file wrapper
375
376 This class provides a wrapper around files opened for
377 temporary use. In particular, it seeks to automatically
378 remove the file when it is no longer needed.
379 """
380
381 def __init__(self, file, name, delete=True):
382 self.file = file
383 self.name = name
384 self.delete = delete
385 self._closer = _TemporaryFileCloser(file, name, delete)
386
387 def __getattr__(self, name):
388 # Attribute lookups are delegated to the underlying file
389 # and cached for non-numeric results
390 # (i.e. methods are cached, closed and friends are not)
391 file = self.__dict__['file']
392 a = getattr(file, name)
393 if hasattr(a, '__call__'):
394 func = a
395 @_functools.wraps(func)
396 def func_wrapper(*args, **kwargs):
397 return func(*args, **kwargs)
398 # Avoid closing the file as long as the wrapper is alive,
399 # see issue #18879.
400 func_wrapper._closer = self._closer
401 a = func_wrapper
402 if not isinstance(a, int):
403 setattr(self, name, a)
404 return a
405
406 # The underlying __enter__ method returns the wrong object
407 # (self.file) so override it to return the wrapper
408 def __enter__(self):
409 self.file.__enter__()
410 return self
411
412 # Need to trap __exit__ as well to ensure the file gets
413 # deleted when used in a with statement
414 def __exit__(self, exc, value, tb):
415 result = self.file.__exit__(exc, value, tb)
416 self.close()
417 return result
418
419 def close(self):
420 """
421 Close the temporary file, possibly deleting it.
422 """
423 self._closer.close()
424
425 # iter() doesn't use __getattr__ to find the __iter__ method
426 def __iter__(self):
427 return iter(self.file)
Christian Heimes3ecfea712008-02-09 20:51:34 +0000428
429
Guido van Rossumf0c74162007-08-28 03:29:45 +0000430def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
431 newline=None, suffix="", prefix=template,
432 dir=None, delete=True):
Guido van Rossum0e548712002-08-09 16:14:33 +0000433 """Create and return a temporary file.
434 Arguments:
435 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000436 'mode' -- the mode argument to io.open (default "w+b").
437 'buffering' -- the buffer size argument to io.open (default -1).
438 'encoding' -- the encoding argument to io.open (default None)
439 'newline' -- the newline argument to io.open (default None)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000440 'delete' -- whether the file is deleted on close (default True).
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 name of the file
444 is accessible as file.name. The file will be automatically deleted
Guido van Rossumd8faa362007-04-27 19:54:29 +0000445 when it is closed unless the 'delete' argument is set to False.
Guido van Rossum0e548712002-08-09 16:14:33 +0000446 """
Tim Peters1baa22af2001-01-12 10:02:46 +0000447
Guido van Rossume888cdc2002-08-17 14:50:24 +0000448 if dir is None:
449 dir = gettempdir()
450
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000451 flags = _bin_openflags
Tim Peters1baa22af2001-01-12 10:02:46 +0000452
Guido van Rossum0e548712002-08-09 16:14:33 +0000453 # Setting O_TEMPORARY in the flags causes the OS to delete
454 # the file when it is closed. This is only supported by Windows.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000455 if _os.name == 'nt' and delete:
Guido van Rossum0e548712002-08-09 16:14:33 +0000456 flags |= _os.O_TEMPORARY
Tim Peters1baa22af2001-01-12 10:02:46 +0000457
Guido van Rossum0e548712002-08-09 16:14:33 +0000458 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000459 file = _io.open(fd, mode, buffering=buffering,
460 newline=newline, encoding=encoding)
461
Guido van Rossumd8faa362007-04-27 19:54:29 +0000462 return _TemporaryFileWrapper(file, name, delete)
Guido van Rossum0e548712002-08-09 16:14:33 +0000463
Jason Tishler80c02af2002-08-14 15:10:09 +0000464if _os.name != 'posix' or _os.sys.platform == 'cygwin':
465 # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
466 # while it is open.
Guido van Rossum0e548712002-08-09 16:14:33 +0000467 TemporaryFile = NamedTemporaryFile
Tim Peters1baa22af2001-01-12 10:02:46 +0000468
469else:
Guido van Rossumf0c74162007-08-28 03:29:45 +0000470 def TemporaryFile(mode='w+b', buffering=-1, encoding=None,
471 newline=None, suffix="", prefix=template,
472 dir=None):
Guido van Rossum0e548712002-08-09 16:14:33 +0000473 """Create and return a temporary file.
474 Arguments:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000475 'prefix', 'suffix', 'dir' -- as for mkstemp.
Guido van Rossumf0c74162007-08-28 03:29:45 +0000476 'mode' -- the mode argument to io.open (default "w+b").
477 'buffering' -- the buffer size argument to io.open (default -1).
478 'encoding' -- the encoding argument to io.open (default None)
479 'newline' -- the newline argument to io.open (default None)
Guido van Rossum0e548712002-08-09 16:14:33 +0000480 The file is created as mkstemp() would do it.
Tim Peters1baa22af2001-01-12 10:02:46 +0000481
Raymond Hettingerfaa10eb2005-01-11 15:33:03 +0000482 Returns an object with a file-like interface. The file has no
483 name, and will cease to exist when it is closed.
Guido van Rossum0e548712002-08-09 16:14:33 +0000484 """
485
Guido van Rossume888cdc2002-08-17 14:50:24 +0000486 if dir is None:
487 dir = gettempdir()
488
Amaury Forgeot d'Arc7d0bddd2009-11-30 00:08:56 +0000489 flags = _bin_openflags
Guido van Rossum0e548712002-08-09 16:14:33 +0000490
491 (fd, name) = _mkstemp_inner(dir, prefix, suffix, flags)
492 try:
493 _os.unlink(name)
Guido van Rossumf0c74162007-08-28 03:29:45 +0000494 return _io.open(fd, mode, buffering=buffering,
495 newline=newline, encoding=encoding)
Guido van Rossum0e548712002-08-09 16:14:33 +0000496 except:
497 _os.close(fd)
498 raise
Guido van Rossumd8faa362007-04-27 19:54:29 +0000499
500class SpooledTemporaryFile:
Serhiy Storchaka4f169a72013-02-09 11:46:42 +0200501 """Temporary file wrapper, specialized to switch from BytesIO
502 or StringIO to a real file when it exceeds a certain size or
Guido van Rossumd8faa362007-04-27 19:54:29 +0000503 when a fileno is needed.
504 """
505 _rolled = False
506
Guido van Rossumf0c74162007-08-28 03:29:45 +0000507 def __init__(self, max_size=0, mode='w+b', buffering=-1,
508 encoding=None, newline=None,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000509 suffix="", prefix=template, dir=None):
Guido van Rossum9a634702007-07-09 10:24:45 +0000510 if 'b' in mode:
511 self._file = _io.BytesIO()
512 else:
Guido van Rossum5d212552007-10-29 16:42:51 +0000513 # Setting newline="\n" avoids newline translation;
514 # this is important because otherwise on Windows we'd
Guido van Rossum98297ee2007-11-06 21:34:58 +0000515 # hget double newline translation upon rollover().
Alexandre Vassalotti3ade6f92008-06-12 01:13:54 +0000516 self._file = _io.StringIO(newline="\n")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000517 self._max_size = max_size
518 self._rolled = False
Guido van Rossumf0c74162007-08-28 03:29:45 +0000519 self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering,
520 'suffix': suffix, 'prefix': prefix,
521 'encoding': encoding, 'newline': newline,
522 'dir': dir}
Guido van Rossumd8faa362007-04-27 19:54:29 +0000523
524 def _check(self, file):
525 if self._rolled: return
526 max_size = self._max_size
527 if max_size and file.tell() > max_size:
528 self.rollover()
529
530 def rollover(self):
531 if self._rolled: return
532 file = self._file
Guido van Rossumf0c74162007-08-28 03:29:45 +0000533 newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000534 del self._TemporaryFileArgs
535
536 newfile.write(file.getvalue())
537 newfile.seek(file.tell(), 0)
538
539 self._rolled = True
540
Christian Heimes3ecfea712008-02-09 20:51:34 +0000541 # The method caching trick from NamedTemporaryFile
542 # won't work here, because _file may change from a
Serhiy Storchaka50254c52013-08-29 11:35:43 +0300543 # BytesIO/StringIO instance to a real file. So we list
Christian Heimes3ecfea712008-02-09 20:51:34 +0000544 # all the methods directly.
545
546 # Context management protocol
547 def __enter__(self):
548 if self._file.closed:
549 raise ValueError("Cannot enter context with closed file")
550 return self
551
552 def __exit__(self, exc, value, tb):
553 self._file.close()
554
Guido van Rossumd8faa362007-04-27 19:54:29 +0000555 # file protocol
556 def __iter__(self):
557 return self._file.__iter__()
558
559 def close(self):
560 self._file.close()
561
562 @property
563 def closed(self):
564 return self._file.closed
565
566 @property
567 def encoding(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200568 try:
569 return self._file.encoding
570 except AttributeError:
571 if 'b' in self._TemporaryFileArgs['mode']:
572 raise
573 return self._TemporaryFileArgs['encoding']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000574
575 def fileno(self):
576 self.rollover()
577 return self._file.fileno()
578
579 def flush(self):
580 self._file.flush()
581
582 def isatty(self):
583 return self._file.isatty()
584
585 @property
586 def mode(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200587 try:
588 return self._file.mode
589 except AttributeError:
590 return self._TemporaryFileArgs['mode']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000591
592 @property
593 def name(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200594 try:
595 return self._file.name
596 except AttributeError:
597 return None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000598
599 @property
600 def newlines(self):
Serhiy Storchakabbbbe8e2013-02-09 12:21:14 +0200601 try:
602 return self._file.newlines
603 except AttributeError:
604 if 'b' in self._TemporaryFileArgs['mode']:
605 raise
606 return self._TemporaryFileArgs['newline']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000607
608 def read(self, *args):
609 return self._file.read(*args)
610
611 def readline(self, *args):
612 return self._file.readline(*args)
613
614 def readlines(self, *args):
615 return self._file.readlines(*args)
616
617 def seek(self, *args):
618 self._file.seek(*args)
619
620 @property
621 def softspace(self):
622 return self._file.softspace
623
624 def tell(self):
625 return self._file.tell()
626
Antoine Pitrou0e86a582011-11-25 18:03:09 +0100627 def truncate(self, size=None):
628 if size is None:
629 self._file.truncate()
630 else:
631 if size > self._max_size:
632 self.rollover()
633 self._file.truncate(size)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000634
635 def write(self, s):
636 file = self._file
637 rv = file.write(s)
638 self._check(file)
639 return rv
640
641 def writelines(self, iterable):
642 file = self._file
643 rv = file.writelines(iterable)
644 self._check(file)
645 return rv
646
Nick Coghlan543af752010-10-24 11:23:25 +0000647
648class TemporaryDirectory(object):
649 """Create and return a temporary directory. This has the same
650 behavior as mkdtemp but can be used as a context manager. For
651 example:
652
653 with TemporaryDirectory() as tmpdir:
654 ...
655
Ezio Melotti30b9d5d2013-08-17 15:50:46 +0300656 Upon exiting the context, the directory and everything contained
Nick Coghlan543af752010-10-24 11:23:25 +0000657 in it are removed.
658 """
659
660 def __init__(self, suffix="", prefix=template, dir=None):
Nick Coghlan543af752010-10-24 11:23:25 +0000661 self._closed = False
Andrew Svetlov737fb892012-12-18 21:14:22 +0200662 self.name = None # Handle mkdtemp raising an exception
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000663 self.name = mkdtemp(suffix, prefix, dir)
664
665 def __repr__(self):
666 return "<{} {!r}>".format(self.__class__.__name__, self.name)
Nick Coghlan543af752010-10-24 11:23:25 +0000667
668 def __enter__(self):
669 return self.name
670
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000671 def cleanup(self, _warn=False):
672 if self.name and not self._closed:
673 try:
674 self._rmtree(self.name)
675 except (TypeError, AttributeError) as ex:
676 # Issue #10188: Emit a warning on stderr
677 # if the directory could not be cleaned
678 # up due to missing globals
679 if "None" not in str(ex):
680 raise
681 print("ERROR: {!r} while cleaning up {!r}".format(ex, self,),
682 file=_sys.stderr)
683 return
Nick Coghlan543af752010-10-24 11:23:25 +0000684 self._closed = True
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000685 if _warn:
686 self._warn("Implicitly cleaning up {!r}".format(self),
687 ResourceWarning)
Nick Coghlan543af752010-10-24 11:23:25 +0000688
689 def __exit__(self, exc, value, tb):
690 self.cleanup()
691
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000692 def __del__(self):
693 # Issue a ResourceWarning if implicit cleanup needed
694 self.cleanup(_warn=True)
Nick Coghlan543af752010-10-24 11:23:25 +0000695
696 # XXX (ncoghlan): The following code attempts to make
697 # this class tolerant of the module nulling out process
698 # that happens during CPython interpreter shutdown
699 # Alas, it doesn't actually manage it. See issue #10188
700 _listdir = staticmethod(_os.listdir)
701 _path_join = staticmethod(_os.path.join)
702 _isdir = staticmethod(_os.path.isdir)
Charles-François Natalidef35432011-07-29 18:59:24 +0200703 _islink = staticmethod(_os.path.islink)
Nick Coghlan543af752010-10-24 11:23:25 +0000704 _remove = staticmethod(_os.remove)
705 _rmdir = staticmethod(_os.rmdir)
Nick Coghlan6b22f3f2010-12-12 15:24:21 +0000706 _warn = _warnings.warn
Nick Coghlan543af752010-10-24 11:23:25 +0000707
708 def _rmtree(self, path):
709 # Essentially a stripped down version of shutil.rmtree. We can't
710 # use globals because they may be None'ed out at shutdown.
711 for name in self._listdir(path):
712 fullname = self._path_join(path, name)
713 try:
Charles-François Natalidef35432011-07-29 18:59:24 +0200714 isdir = self._isdir(fullname) and not self._islink(fullname)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200715 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000716 isdir = False
717 if isdir:
718 self._rmtree(fullname)
719 else:
720 try:
721 self._remove(fullname)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200722 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000723 pass
724 try:
725 self._rmdir(path)
Andrew Svetlovad28c7f2012-12-18 22:02:39 +0200726 except OSError:
Nick Coghlan543af752010-10-24 11:23:25 +0000727 pass